﻿/* band.js */
Timeline._Band = function(B, G, C)
{
    if (B.autoWidth && typeof G.width == "string")
    {
        G.width = G.width.indexOf("%") > -1 ? 0 : parseInt(G.width);
    }
    this._timeline = B;
    this._bandInfo = G;
    this._index = C;
    this._locale = ("locale" in G) ? G.locale : Timeline.getDefaultLocale();
    this._timeZone = ("timeZone" in G) ? G.timeZone : 0;
    this._labeller = ("labeller" in G) ? G.labeller : (("createLabeller" in B.getUnit()) ? B.getUnit().createLabeller(this._locale, this._timeZone) : new Timeline.GregorianDateLabeller(this._locale, this._timeZone));
    this._theme = G.theme;
    this._zoomIndex = ("zoomIndex" in G) ? G.zoomIndex : 0;
    this._zoomSteps = ("zoomSteps" in G) ? G.zoomSteps : null;
    this._dragging = false;
    this._changing = false;
    this._originalScrollSpeed = 5;
    this._scrollSpeed = this._originalScrollSpeed;
    this._onScrollListeners = [];
    var A = this;
    this._syncWithBand = null;
    this._syncWithBandHandler = function(H)
    {
        A._onHighlightBandScroll();
    };
    this._selectorListener = function(H)
    {
        A._onHighlightBandScroll();
    };
    var E = this._timeline.getDocument().createElement("div");
    E.className = "timeline-band-input";
    this._timeline.addDiv(E);
    this._keyboardInput = document.createElement("input");
    this._keyboardInput.type = "text";
    E.appendChild(this._keyboardInput);
    SimileAjax.DOM.registerEventWithObject(this._keyboardInput, "keydown", this, "_onKeyDown");
    SimileAjax.DOM.registerEventWithObject(this._keyboardInput, "keyup", this, "_onKeyUp");
    this._div = this._timeline.getDocument().createElement("div");
    this._div.id = "timeline-band-" + C;
    this._div.className = "timeline-band timeline-band-" + C;
    this._timeline.addDiv(this._div);
    SimileAjax.DOM.registerEventWithObject(this._div, "mousedown", this, "_onMouseDown");
    SimileAjax.DOM.registerEventWithObject(this._div, "mousemove", this, "_onMouseMove");
    SimileAjax.DOM.registerEventWithObject(this._div, "mouseup", this, "_onMouseUp");
    SimileAjax.DOM.registerEventWithObject(this._div, "mouseout", this, "_onMouseOut");
    SimileAjax.DOM.registerEventWithObject(this._div, "dblclick", this, "_onDblClick");
    var F = this._theme != null ? this._theme.mouseWheel : "scroll";
    if (F === "zoom" || F === "scroll" || this._zoomSteps)
    {
        if (SimileAjax.Platform.browser.isFirefox)
        {
            SimileAjax.DOM.registerEventWithObject(this._div, "DOMMouseScroll", this, "_onMouseScroll");
        }
        else
        {
            SimileAjax.DOM.registerEventWithObject(this._div, "mousewheel", this, "_onMouseScroll");
        }
    }
    this._innerDiv = this._timeline.getDocument().createElement("div");
    this._innerDiv.className = "timeline-band-inner";
    this._div.appendChild(this._innerDiv);
    this._ether = G.ether;
    G.ether.initialize(this, B);
    this._etherPainter = G.etherPainter;
    G.etherPainter.initialize(this, B);
    this._eventSource = G.eventSource;
    if (this._eventSource)
    {
        this._eventListener = {onAddMany:function()
        {
            A._onAddMany();
        },onClear:function()
        {
            A._onClear();
        }};
        this._eventSource.addListener(this._eventListener);
    }
    this._eventPainter = G.eventPainter;
    this._eventTracksNeeded = 0;
    this._eventTrackIncrement = 0;
    G.eventPainter.initialize(this, B);
    this._decorators = ("decorators" in G) ? G.decorators : [];
    for (var D = 0;
         D < this._decorators.length;
         D++)
    {
        this._decorators[D].initialize(this, B);
    }
};
Timeline._Band.SCROLL_MULTIPLES = 5;
Timeline._Band.prototype.dispose = function()
{
    this.closeBubble();
    if (this._eventSource)
    {
        this._eventSource.removeListener(this._eventListener);
        this._eventListener = null;
        this._eventSource = null;
    }
    this._timeline = null;
    this._bandInfo = null;
    this._labeller = null;
    this._ether = null;
    this._etherPainter = null;
    this._eventPainter = null;
    this._decorators = null;
    this._onScrollListeners = null;
    this._syncWithBandHandler = null;
    this._selectorListener = null;
    this._div = null;
    this._innerDiv = null;
    this._keyboardInput = null;
};
Timeline._Band.prototype.addOnScrollListener = function(A)
{
    this._onScrollListeners.push(A);
};
Timeline._Band.prototype.removeOnScrollListener = function(B)
{
    for (var A = 0;
         A < this._onScrollListeners.length;
         A++)
    {
        if (this._onScrollListeners[A] == B)
        {
            this._onScrollListeners.splice(A, 1);
            break;
        }
    }
};
Timeline._Band.prototype.setSyncWithBand = function(B, A)
{
    if (this._syncWithBand)
    {
        this._syncWithBand.removeOnScrollListener(this._syncWithBandHandler);
    }
    this._syncWithBand = B;
    this._syncWithBand.addOnScrollListener(this._syncWithBandHandler);
    this._highlight = A;
    this._positionHighlight();
};
Timeline._Band.prototype.getLocale = function()
{
    return this._locale;
};
Timeline._Band.prototype.getTimeZone = function()
{
    return this._timeZone;
};
Timeline._Band.prototype.getLabeller = function()
{
    return this._labeller;
};
Timeline._Band.prototype.getIndex = function()
{
    return this._index;
};
Timeline._Band.prototype.getEther = function()
{
    return this._ether;
};
Timeline._Band.prototype.getEtherPainter = function()
{
    return this._etherPainter;
};
Timeline._Band.prototype.getEventSource = function()
{
    return this._eventSource;
};
Timeline._Band.prototype.getEventPainter = function()
{
    return this._eventPainter;
};
Timeline._Band.prototype.getTimeline = function()
{
    return this._timeline;
};
Timeline._Band.prototype.updateEventTrackInfo = function(A, B)
{
    this._eventTrackIncrement = B;
    if (A > this._eventTracksNeeded)
    {
        this._eventTracksNeeded = A;
    }
};
Timeline._Band.prototype.checkAutoWidth = function()
{
    if (!this._timeline.autoWidth)
    {
        return;
    }
    var C = this._eventPainter.getType() == "overview";
    var A = C ? this._theme.event.overviewTrack.autoWidthMargin : this._theme.event.track.autoWidthMargin;
    var B = Math.ceil((this._eventTracksNeeded + A) * this._eventTrackIncrement);
    B += C ? this._theme.event.overviewTrack.offset : this._theme.event.track.offset;
    var D = this._bandInfo;
    if (B != D.width)
    {
        D.width = B;
    }
};
Timeline._Band.prototype.layout = function()
{
    this.paint();
};
Timeline._Band.prototype.paint = function()
{
    this._etherPainter.paint();
    this._paintDecorators();
    this._paintEvents();
};
Timeline._Band.prototype.softLayout = function()
{
    this.softPaint();
};
Timeline._Band.prototype.softPaint = function()
{
    this._etherPainter.softPaint();
    this._softPaintDecorators();
    this._softPaintEvents();
};
Timeline._Band.prototype.setBandShiftAndWidth = function(A, D)
{
    var C = this._keyboardInput.parentNode;
    var B = A + Math.floor(D / 2);
    if (this._timeline.isHorizontal())
    {
        this._div.style.top = A + "px";
        this._div.style.height = D + "px";
        C.style.top = B + "px";
        C.style.left = "-1em";
    }
    else
    {
        this._div.style.left = A + "px";
        this._div.style.width = D + "px";
        C.style.left = B + "px";
        C.style.top = "-1em";
    }
};
Timeline._Band.prototype.getViewWidth = function()
{
    if (this._timeline.isHorizontal())
    {
        return this._div.offsetHeight;
    }
    else
    {
        return this._div.offsetWidth;
    }
};
Timeline._Band.prototype.setViewLength = function(A)
{
    this._viewLength = A;
    this._recenterDiv();
    this._onChanging();
};
Timeline._Band.prototype.getViewLength = function()
{
    return this._viewLength;
};
Timeline._Band.prototype.getTotalViewLength = function()
{
    return Timeline._Band.SCROLL_MULTIPLES * this._viewLength;
};
Timeline._Band.prototype.getViewOffset = function()
{
    return this._viewOffset;
};
Timeline._Band.prototype.getMinDate = function()
{
    return this._ether.pixelOffsetToDate(this._viewOffset);
};
Timeline._Band.prototype.getMaxDate = function()
{
    return this._ether.pixelOffsetToDate(this._viewOffset + Timeline._Band.SCROLL_MULTIPLES * this._viewLength);
};
Timeline._Band.prototype.getMinVisibleDate = function()
{
    return this._ether.pixelOffsetToDate(0);
};
Timeline._Band.prototype.getMinVisibleDateAfterDelta = function(A)
{
    return this._ether.pixelOffsetToDate(A);
};
Timeline._Band.prototype.getMaxVisibleDate = function()
{
    return this._ether.pixelOffsetToDate(this._viewLength);
};
Timeline._Band.prototype.getMaxVisibleDateAfterDelta = function(A)
{
    return this._ether.pixelOffsetToDate(this._viewLength + A);
};
Timeline._Band.prototype.getCenterVisibleDate = function()
{
    return this._ether.pixelOffsetToDate(this._viewLength / 2);
};
Timeline._Band.prototype.setMinVisibleDate = function(A)
{
    if (!this._changing)
    {
        this._moveEther(Math.round(-this._ether.dateToPixelOffset(A)));
    }
};
Timeline._Band.prototype.setMaxVisibleDate = function(A)
{
    if (!this._changing)
    {
        this._moveEther(Math.round(this._viewLength - this._ether.dateToPixelOffset(A)));
    }
};
Timeline._Band.prototype.setCenterVisibleDate = function(A)
{
    if (!this._changing)
    {
        this._moveEther(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(A)));
    }
};
Timeline._Band.prototype.dateToPixelOffset = function(A)
{
    return this._ether.dateToPixelOffset(A) - this._viewOffset;
};
Timeline._Band.prototype.pixelOffsetToDate = function(A)
{
    return this._ether.pixelOffsetToDate(A + this._viewOffset);
};
Timeline._Band.prototype.createLayerDiv = function(C, A)
{
    var D = this._timeline.getDocument().createElement("div");
    D.className = "timeline-band-layer" + (typeof A == "string" ? (" " + A) : "");
    D.style.zIndex = C;
    this._innerDiv.appendChild(D);
    var B = this._timeline.getDocument().createElement("div");
    B.className = "timeline-band-layer-inner";
    if (SimileAjax.Platform.browser.isIE)
    {
        B.style.cursor = "move";
    }
    else
    {
        B.style.cursor = "-moz-grab";
    }
    D.appendChild(B);
    return B;
};
Timeline._Band.prototype.removeLayerDiv = function(A)
{
    this._innerDiv.removeChild(A.parentNode);
};
Timeline._Band.prototype.scrollToCenter = function(A, C)
{
    var B = this._ether.dateToPixelOffset(A);
    if (B < -this._viewLength / 2)
    {
        this.setCenterVisibleDate(this.pixelOffsetToDate(B + this._viewLength));
    }
    else
    {
        if (B > 3 * this._viewLength / 2)
        {
            this.setCenterVisibleDate(this.pixelOffsetToDate(B - this._viewLength));
        }
    }
    this._autoScroll(Math.round(this._viewLength / 2 - this._ether.dateToPixelOffset(A)), C);
};
Timeline._Band.prototype.showBubbleForEvent = function(C)
{
    var A = this.getEventSource().getEvent(C);
    if (A)
    {
        var B = this;
        this.scrollToCenter(A.getStart(), function()
        {
            B._eventPainter.showBubble(A);
        });
    }
};
Timeline._Band.prototype.zoom = function(C, A, F, E)
{
    if (!this._zoomSteps)
    {
        return;
    }
    A += this._viewOffset;
    var D = this._ether.pixelOffsetToDate(A);
    var B = this._ether.zoom(C);
    this._etherPainter.zoom(B);
    this._moveEther(Math.round(-this._ether.dateToPixelOffset(D)));
    this._moveEther(A);
};
Timeline._Band.prototype._onMouseDown = function(B, A, C)
{
    this.closeBubble();
    this._dragging = true;
    this._dragX = A.clientX;
    this._dragY = A.clientY;
};
Timeline._Band.prototype._onMouseMove = function(D, A, E)
{
    if (this._dragging)
    {
        var C = A.clientX - this._dragX;
        var B = A.clientY - this._dragY;
        this._dragX = A.clientX;
        this._dragY = A.clientY;
        this._moveEther(this._timeline.isHorizontal() ? C : B);
        this._positionHighlight();
    }
};
Timeline._Band.prototype._onMouseUp = function(B, A, C)
{
    this._dragging = false;
    this._keyboardInput.focus();
};
Timeline._Band.prototype._onMouseOut = function(C, B, D)
{
    var A = SimileAjax.DOM.getEventRelativeCoordinates(B, C);
    A.x += this._viewOffset;
    if (A.x < 0 || A.x > C.offsetWidth || A.y < 0 || A.y > C.offsetHeight)
    {
        this._dragging = false;
    }
};
Timeline._Band.prototype._onMouseScroll = function(G, H, B)
{
    var A = new Date();
    A = A.getTime();
    if (!this._lastScrollTime || ((A - this._lastScrollTime) > 50))
    {
        this._lastScrollTime = A;
        var I = 0;
        if (H.wheelDelta)
        {
            I = H.wheelDelta / 120;
        }
        else
        {
            if (H.detail)
            {
                I = -H.detail / 3;
            }
        }
        var F = this._theme.mouseWheel;
        if (this._zoomSteps || F === "zoom")
        {
            var E = SimileAjax.DOM.getEventRelativeCoordinates(H, G);
            if (I != 0)
            {
                var D;
                if (I > 0)
                {
                    D = true;
                }
                if (I < 0)
                {
                    D = false;
                }
                this._timeline.zoom(D, E.x, E.y, G);
            }
        }
        else
        {
            if (F === "scroll")
            {
                var C = 50 * (I < 0 ? -1 : 1);
                this._moveEther(C);
            }
        }
    }
    if (H.stopPropagation)
    {
        H.stopPropagation();
    }
    H.cancelBubble = true;
    if (H.preventDefault)
    {
        H.preventDefault();
    }
    H.returnValue = false;
};
Timeline._Band.prototype._onDblClick = function(C, B, E)
{
    var A = SimileAjax.DOM.getEventRelativeCoordinates(B, C);
    var D = A.x - (this._viewLength / 2 - this._viewOffset);
    this._autoScroll(-D);
};
Timeline._Band.prototype._onKeyDown = function(B, A, C)
{
    if (!this._dragging)
    {
        switch (A.keyCode)
        {case 27:break;
            case 37:case 38:this._scrollSpeed = Math.min(50, Math.abs(this._scrollSpeed * 1.05));
            this._moveEther(this._scrollSpeed);
            break;
            case 39:case 40:this._scrollSpeed = -Math.min(50, Math.abs(this._scrollSpeed * 1.05));
            this._moveEther(this._scrollSpeed);
            break;
            default:return true;
        }
        this.closeBubble();
        SimileAjax.DOM.cancelEvent(A);
        return false;
    }
    return true;
};
Timeline._Band.prototype._onKeyUp = function(B, A, C)
{
    if (!this._dragging)
    {
        this._scrollSpeed = this._originalScrollSpeed;
        switch (A.keyCode)
        {case 35:this.setCenterVisibleDate(this._eventSource.getLatestDate());
            break;
            case 36:this.setCenterVisibleDate(this._eventSource.getEarliestDate());
                break;
            case 33:this._autoScroll(this._timeline.getPixelLength());
                break;
            case 34:this._autoScroll(-this._timeline.getPixelLength());
                break;
            default:return true;
        }
        this.closeBubble();
        SimileAjax.DOM.cancelEvent(A);
        return false;
    }
    return true;
};
Timeline._Band.prototype._autoScroll = function(D, C)
{
    var A = this;
    var B = SimileAjax.Graphics.createAnimation(function(E, F)
    {
        A._moveEther(F);
    }, 0, D, 1000, C);
    B.run();
};
Timeline._Band.prototype._moveEther = function(A)
{
    this.closeBubble();
    if (!this._timeline.shiftOK(this._index, A))
    {
        return;
    }
    this._viewOffset += A;
    this._ether.shiftPixels(-A);
    if (this._timeline.isHorizontal())
    {
        this._div.style.left = this._viewOffset + "px";
    }
    else
    {
        this._div.style.top = this._viewOffset + "px";
    }
    if (this._viewOffset > -this._viewLength * 0.5 || this._viewOffset < -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1.5))
    {
        this._recenterDiv();
    }
    else
    {
        this.softLayout();
    }
    this._onChanging();
};
Timeline._Band.prototype._onChanging = function()
{
    this._changing = true;
    this._fireOnScroll();
    this._setSyncWithBandDate();
    this._changing = false;
};
Timeline._Band.prototype.busy = function()
{
    return(this._changing);
};
Timeline._Band.prototype._fireOnScroll = function()
{
    for (var A = 0;
         A < this._onScrollListeners.length;
         A++)
    {
        this._onScrollListeners[A](this);
    }
};
Timeline._Band.prototype._setSyncWithBandDate = function()
{
    if (this._syncWithBand)
    {
        var A = this._ether.pixelOffsetToDate(this.getViewLength() / 2);
        this._syncWithBand.setCenterVisibleDate(A);
    }
};
Timeline._Band.prototype._onHighlightBandScroll = function()
{
    if (this._syncWithBand)
    {
        var A = this._syncWithBand.getCenterVisibleDate();
        var B = this._ether.dateToPixelOffset(A);
        this._moveEther(Math.round(this._viewLength / 2 - B));
        if (this._highlight)
        {
            this._etherPainter.setHighlight(this._syncWithBand.getMinVisibleDate(), this._syncWithBand.getMaxVisibleDate());
        }
    }
};
Timeline._Band.prototype._onAddMany = function()
{
    this._paintEvents();
};
Timeline._Band.prototype._onClear = function()
{
    this._paintEvents();
};
Timeline._Band.prototype._positionHighlight = function()
{
    if (this._syncWithBand)
    {
        var A = this._syncWithBand.getMinVisibleDate();
        var B = this._syncWithBand.getMaxVisibleDate();
        if (this._highlight)
        {
            this._etherPainter.setHighlight(A, B);
        }
    }
};
Timeline._Band.prototype._recenterDiv = function()
{
    this._viewOffset = -this._viewLength * (Timeline._Band.SCROLL_MULTIPLES - 1) / 2;
    if (this._timeline.isHorizontal())
    {
        this._div.style.left = this._viewOffset + "px";
        this._div.style.width = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px";
    }
    else
    {
        this._div.style.top = this._viewOffset + "px";
        this._div.style.height = (Timeline._Band.SCROLL_MULTIPLES * this._viewLength) + "px";
    }
    this.layout();
};
Timeline._Band.prototype._paintEvents = function()
{
    this._eventPainter.paint();
};
Timeline._Band.prototype._softPaintEvents = function()
{
    this._eventPainter.softPaint();
};
Timeline._Band.prototype._paintDecorators = function()
{
    for (var A = 0;
         A < this._decorators.length;
         A++)
    {
        this._decorators[A].paint();
    }
};
Timeline._Band.prototype._softPaintDecorators = function()
{
    for (var A = 0;
         A < this._decorators.length;
         A++)
    {
        this._decorators[A].softPaint();
    }
};
Timeline._Band.prototype.closeBubble = function()
{
    SimileAjax.WindowManager.cancelPopups();
};


/* compact-painter.js */
Timeline.CompactEventPainter = function(A)
{
    this._params = A;
    this._onSelectListeners = [];
    this._filterMatcher = null;
    this._highlightMatcher = null;
    this._frc = null;
    this._eventIdToElmt = {};
};
Timeline.CompactEventPainter.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._backLayer = null;
    this._eventLayer = null;
    this._lineLayer = null;
    this._highlightLayer = null;
    this._eventIdToElmt = null;
};
Timeline.CompactEventPainter.prototype.addOnSelectListener = function(A)
{
    this._onSelectListeners.push(A);
};
Timeline.CompactEventPainter.prototype.removeOnSelectListener = function(B)
{
    for (var A = 0;
         A < this._onSelectListeners.length;
         A++)
    {
        if (this._onSelectListeners[A] == B)
        {
            this._onSelectListeners.splice(A, 1);
            break;
        }
    }
};
Timeline.CompactEventPainter.prototype.getFilterMatcher = function()
{
    return this._filterMatcher;
};
Timeline.CompactEventPainter.prototype.setFilterMatcher = function(A)
{
    this._filterMatcher = A;
};
Timeline.CompactEventPainter.prototype.getHighlightMatcher = function()
{
    return this._highlightMatcher;
};
Timeline.CompactEventPainter.prototype.setHighlightMatcher = function(A)
{
    this._highlightMatcher = A;
};
Timeline.CompactEventPainter.prototype.paint = function()
{
    var N = this._band.getEventSource();
    if (N == null)
    {
        return;
    }
    this._eventIdToElmt = {};
    this._prepareForPainting();
    var O = this._params.theme;
    var L = O.event;
    var G = {trackOffset:"trackOffset" in this._params ? this._params.trackOffset : 10,trackHeight:"trackHeight" in this._params ? this._params.trackHeight : 10,tapeHeight:O.event.tape.height,tapeBottomMargin:"tapeBottomMargin" in this._params ? this._params.tapeBottomMargin : 2,labelBottomMargin:"labelBottomMargin" in this._params ? this._params.labelBottomMargin : 5,labelRightMargin:"labelRightMargin" in this._params ? this._params.labelRightMargin : 5,defaultIcon:L.instant.icon,defaultIconWidth:L.instant.iconWidth,defaultIconHeight:L.instant.iconHeight,customIconWidth:"iconWidth" in this._params ? this._params.iconWidth : L.instant.iconWidth,customIconHeight:"iconHeight" in this._params ? this._params.iconHeight : L.instant.iconHeight,iconLabelGap:"iconLabelGap" in this._params ? this._params.iconLabelGap : 2,iconBottomMargin:"iconBottomMargin" in this._params ? this._params.iconBottomMargin : 2};
    if ("compositeIcon" in this._params)
    {
        G.compositeIcon = this._params.compositeIcon;
        G.compositeIconWidth = this._params.compositeIconWidth || G.customIconWidth;
        G.compositeIconHeight = this._params.compositeIconHeight || G.customIconHeight;
    }
    else
    {
        G.compositeIcon = G.defaultIcon;
        G.compositeIconWidth = G.defaultIconWidth;
        G.compositeIconHeight = G.defaultIconHeight;
    }
    G.defaultStackIcon = "icon" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.icon : G.defaultIcon;
    G.defaultStackIconWidth = "iconWidth" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.iconWidth : G.defaultIconWidth;
    G.defaultStackIconHeight = "iconHeight" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.iconHeight : G.defaultIconHeight;
    var B = this._band.getMinDate();
    var D = this._band.getMaxDate();
    var R = (this._filterMatcher != null) ? this._filterMatcher : function(S)
    {
        return true;
    };
    var Q = (this._highlightMatcher != null) ? this._highlightMatcher : function(S)
    {
        return -1;
    };
    var F = N.getEventIterator(B, D);
    var H = "stackConcurrentPreciseInstantEvents" in this._params && typeof this._params.stackConcurrentPreciseInstantEvents == "object";
    var P = "collapseConcurrentPreciseInstantEvents" in this._params && this._params.collapseConcurrentPreciseInstantEvents;
    if (P || H)
    {
        var M = [];
        var A = null;
        while (F.hasNext())
        {
            var E = F.next();
            if (R(E))
            {
                if (!E.isInstant() || E.isImprecise())
                {
                    this.paintEvent(E, G, this._params.theme, Q(E));
                }
                else
                {
                    if (A != null && A.getStart().getTime() == E.getStart().getTime())
                    {
                        M[M.length - 1].push(E);
                    }
                    else
                    {
                        M.push([E]);
                        A = E;
                    }
                }
            }
        }
        for (var J = 0;
             J < M.length;
             J++)
        {
            var K = M[J];
            if (K.length == 1)
            {
                this.paintEvent(K[0], G, this._params.theme, Q(E));
            }
            else
            {
                var C = -1;
                for (var I = 0;
                     C < 0 && I < K.length;
                     I++)
                {
                    C = Q(K[I]);
                }
                if (H)
                {
                    this.paintStackedPreciseInstantEvents(K, G, this._params.theme, C);
                }
                else
                {
                    this.paintCompositePreciseInstantEvents(K, G, this._params.theme, C);
                }
            }
        }
    }
    else
    {
        while (F.hasNext())
        {
            var E = F.next();
            if (R(E))
            {
                this.paintEvent(E, G, this._params.theme, Q(E));
            }
        }
    }
    this._highlightLayer.style.display = "block";
    this._lineLayer.style.display = "block";
    this._eventLayer.style.display = "block";
};
Timeline.CompactEventPainter.prototype.softPaint = function()
{
};
Timeline.CompactEventPainter.prototype._prepareForPainting = function()
{
    var B = this._band;
    if (this._backLayer == null)
    {
        this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
        this._backLayer.style.visibility = "hidden";
        var A = document.createElement("span");
        A.className = "timeline-event-label";
        this._backLayer.appendChild(A);
        this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
    }
    this._frc.update();
    this._tracks = [];
    if (this._highlightLayer != null)
    {
        B.removeLayerDiv(this._highlightLayer);
    }
    this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
    this._highlightLayer.style.display = "none";
    if (this._lineLayer != null)
    {
        B.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
    this._lineLayer.style.display = "none";
    if (this._eventLayer != null)
    {
        B.removeLayerDiv(this._eventLayer);
    }
    this._eventLayer = B.createLayerDiv(115, "timeline-band-events");
    this._eventLayer.style.display = "none";
};
Timeline.CompactEventPainter.prototype.paintEvent = function(B, C, D, A)
{
    if (B.isInstant())
    {
        this.paintInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintDurationEvent(B, C, D, A);
    }
};
Timeline.CompactEventPainter.prototype.paintInstantEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseInstantEvent(B, C, D, A);
    }
};
Timeline.CompactEventPainter.prototype.paintDurationEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseDurationEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseDurationEvent(B, C, D, A);
    }
};
Timeline.CompactEventPainter.prototype.paintPreciseInstantEvent = function(H, F, B, A)
{
    var C = {tooltip:H.getProperty("tooltip") || H.getText()};
    var E = {url:H.getIcon()};
    if (E.url == null)
    {
        E.url = F.defaultIcon;
        E.width = F.defaultIconWidth;
        E.height = F.defaultIconHeight;
        E.className = "timeline-event-icon-default";
    }
    else
    {
        E.width = H.getProperty("iconWidth") || F.customIconWidth;
        E.height = H.getProperty("iconHeight") || F.customIconHeight;
    }
    var J = {text:H.getText(),color:H.getTextColor() || H.getColor(),className:H.getClassName()};
    var G = this.paintTapeIconLabel(H.getStart(), C, null, E, J, F, B, A);
    var I = this;
    var D = function(L, K, M)
    {
        return I._onClickInstantEvent(G.iconElmtData.elmt, K, H);
    };
    SimileAjax.DOM.registerEvent(G.iconElmtData.elmt, "mousedown", D);
    SimileAjax.DOM.registerEvent(G.labelElmtData.elmt, "mousedown", D);
    this._eventIdToElmt[H.getID()] = G.iconElmtData.elmt;
};
Timeline.CompactEventPainter.prototype.paintCompositePreciseInstantEvents = function(J, H, D, B)
{
    var K = J[0];
    var A = [];
    for (var C = 0;
         C < J.length;
         C++)
    {
        A.push(J[C].getProperty("tooltip") || J[C].getText());
    }
    var E = {tooltip:A.join("; ")};
    var G = {url:H.compositeIcon,width:H.compositeIconWidth,height:H.compositeIconHeight,className:"timeline-event-icon-composite"};
    var M = {text:String.substitute(this._params.compositeEventLabelTemplate, [J.length])};
    var I = this.paintTapeIconLabel(K.getStart(), E, null, G, M, H, D, B);
    var L = this;
    var F = function(O, N, P)
    {
        return L._onClickMultiplePreciseInstantEvent(I.iconElmtData.elmt, N, J);
    };
    SimileAjax.DOM.registerEvent(I.iconElmtData.elmt, "mousedown", F);
    SimileAjax.DOM.registerEvent(I.labelElmtData.elmt, "mousedown", F);
    for (var C = 0;
         C < J.length;
         C++)
    {
        this._eventIdToElmt[J[C].getID()] = I.iconElmtData.elmt;
    }
};
Timeline.CompactEventPainter.prototype.paintStackedPreciseInstantEvents = function(T, j, c, E)
{
    var S = "limit" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.limit : 10;
    var G = "moreMessageTemplate" in this._params.stackConcurrentPreciseInstantEvents ? this._params.stackConcurrentPreciseInstantEvents.moreMessageTemplate : "%0 More Events";
    var Q = S <= T.length - 2;
    var B = this._band;
    var L = function(i)
    {
        return Math.round(B.dateToPixelOffset(i));
    };
    var O = function(i)
    {
        var r = {url:i.getIcon()};
        if (r.url == null)
        {
            r.url = j.defaultStackIcon;
            r.width = j.defaultStackIconWidth;
            r.height = j.defaultStackIconHeight;
            r.className = "timeline-event-icon-stack timeline-event-icon-default";
        }
        else
        {
            r.width = i.getProperty("iconWidth") || j.customIconWidth;
            r.height = i.getProperty("iconHeight") || j.customIconHeight;
            r.className = "timeline-event-icon-stack";
        }
        return r;
    };
    var C = O(T[0]);
    var V = 5;
    var D = 0;
    var g = 0;
    var p = 0;
    var U = 0;
    var l = [];
    for (var n = 0;
         n < T.length && (!Q || n < S);
         n++)
    {
        var b = T[n];
        var a = b.getText();
        var X = O(b);
        var W = this._frc.computeSize(a);
        var K = {text:a,iconData:X,labelSize:W,iconLeft:C.width + n * V - X.width};
        K.labelLeft = C.width + n * V + j.iconLabelGap;
        K.top = p;
        l.push(K);
        D = Math.min(D, K.iconLeft);
        p += W.height;
        g = Math.max(g, K.labelLeft + W.width);
        U = Math.max(U, K.top + X.height);
    }
    if (Q)
    {
        var e = String.substitute(G, [T.length - S]);
        var H = this._frc.computeSize(e);
        var J = C.width + (S - 1) * V + j.iconLabelGap;
        var m = p;
        p += H.height;
        g = Math.max(g, J + H.width);
    }
    g += j.labelRightMargin;
    p += j.labelBottomMargin;
    U += j.iconBottomMargin;
    var F = L(T[0].getStart());
    var Y = [];
    var N = Math.ceil(Math.max(U, p) / j.trackHeight);
    var M = C.width + (T.length - 1) * V;
    for (var n = 0;
         n < N;
         n++)
    {
        Y.push({start:D,end:M});
    }
    var f = Math.ceil(p / j.trackHeight);
    for (var n = 0;
         n < f;
         n++)
    {
        var P = Y[n];
        P.end = Math.max(P.end, g);
    }
    var k = this._fitTracks(F, Y);
    var Z = k * j.trackHeight + j.trackOffset;
    var q = this._timeline.getDocument().createElement("div");
    q.className = "timeline-event-icon-stack";
    q.style.position = "absolute";
    q.style.overflow = "visible";
    q.style.left = F + "px";
    q.style.top = Z + "px";
    q.style.width = M + "px";
    q.style.height = U + "px";
    q.innerHTML = "<div style='position: relative'></div>";
    this._eventLayer.appendChild(q);
    var I = this;
    var R = function(r)
    {
        try
        {
            var w = parseInt(this.getAttribute("index"));
            var u = q.firstChild.childNodes;
            for (var s = 0;
                 s < u.length;
                 s++)
            {
                var v = u[s];
                if (s == w)
                {
                    v.style.zIndex = u.length;
                }
                else
                {
                    v.style.zIndex = u.length - s;
                }
            }
        } catch(t)
        {
        }
    };
    var d = function(u)
    {
        var w = l[u];
        var r = T[u];
        var i = r.getProperty("tooltip") || r.getText();
        var v = I._paintEventLabel({tooltip:i}, {text:w.text}, F + w.labelLeft, Z + w.top, w.labelSize.width, w.labelSize.height, c);
        v.elmt.setAttribute("index", u);
        v.elmt.onmouseover = R;
        var t = SimileAjax.Graphics.createTranslucentImage(w.iconData.url);
        var s = I._timeline.getDocument().createElement("div");
        s.className = "timeline-event-icon" + ("className" in w.iconData ? (" " + w.iconData.className) : "");
        s.style.left = w.iconLeft + "px";
        s.style.top = w.top + "px";
        s.style.zIndex = (l.length - u);
        s.appendChild(t);
        s.setAttribute("index", u);
        s.onmouseover = R;
        q.firstChild.appendChild(s);
        var x = function(z, y, AA)
        {
            return I._onClickInstantEvent(v.elmt, y, r);
        };
        SimileAjax.DOM.registerEvent(s, "mousedown", x);
        SimileAjax.DOM.registerEvent(v.elmt, "mousedown", x);
        I._eventIdToElmt[r.getID()] = s;
    };
    for (var n = 0;
         n < l.length;
         n++)
    {
        d(n);
    }
    if (Q)
    {
        var o = T.slice(S);
        var A = this._paintEventLabel({tooltip:e}, {text:e}, F + J, Z + m, H.width, H.height, c);
        var h = function(r, i, s)
        {
            return I._onClickMultiplePreciseInstantEvent(A.elmt, i, o);
        };
        SimileAjax.DOM.registerEvent(A.elmt, "mousedown", h);
        for (var n = 0;
             n < o.length;
             n++)
        {
            this._eventIdToElmt[o[n].getID()] = A.elmt;
        }
    }
};
Timeline.CompactEventPainter.prototype.paintImpreciseInstantEvent = function(I, G, B, A)
{
    var C = {tooltip:I.getProperty("tooltip") || I.getText()};
    var E = {start:I.getStart(),end:I.getEnd(),latestStart:I.getLatestStart(),earliestEnd:I.getEarliestEnd(),isInstant:true};
    var F = {url:I.getIcon()};
    if (F.url == null)
    {
        F = null;
    }
    else
    {
        F.width = I.getProperty("iconWidth") || G.customIconWidth;
        F.height = I.getProperty("iconHeight") || G.customIconHeight;
    }
    var K = {text:I.getText(),color:I.getTextColor() || I.getColor(),className:I.getClassName()};
    var H = this.paintTapeIconLabel(I.getStart(), C, E, F, K, G, B, A);
    var J = this;
    var D = F != null ? function(M, L, N)
    {
        return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
    } : function(M, L, N)
    {
        return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
    };
    SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
    SimileAjax.DOM.registerEvent(H.impreciseTapeElmtData.elmt, "mousedown", D);
    if (F != null)
    {
        SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
        this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
    }
    else
    {
        this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
    }
};
Timeline.CompactEventPainter.prototype.paintPreciseDurationEvent = function(I, G, B, A)
{
    var C = {tooltip:I.getProperty("tooltip") || I.getText()};
    var E = {start:I.getStart(),end:I.getEnd(),isInstant:false};
    var F = {url:I.getIcon()};
    if (F.url == null)
    {
        F = null;
    }
    else
    {
        F.width = I.getProperty("iconWidth") || G.customIconWidth;
        F.height = I.getProperty("iconHeight") || G.customIconHeight;
    }
    var K = {text:I.getText(),color:I.getTextColor() || I.getColor(),className:I.getClassName()};
    var H = this.paintTapeIconLabel(I.getLatestStart(), C, E, F, K, G, B, A);
    var J = this;
    var D = F != null ? function(M, L, N)
    {
        return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
    } : function(M, L, N)
    {
        return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
    };
    SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
    SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt, "mousedown", D);
    if (F != null)
    {
        SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
        this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
    }
    else
    {
        this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
    }
};
Timeline.CompactEventPainter.prototype.paintImpreciseDurationEvent = function(I, G, B, A)
{
    var C = {tooltip:I.getProperty("tooltip") || I.getText()};
    var E = {start:I.getStart(),end:I.getEnd(),latestStart:I.getLatestStart(),earliestEnd:I.getEarliestEnd(),isInstant:false};
    var F = {url:I.getIcon()};
    if (F.url == null)
    {
        F = null;
    }
    else
    {
        F.width = I.getProperty("iconWidth") || G.customIconWidth;
        F.height = I.getProperty("iconHeight") || G.customIconHeight;
    }
    var K = {text:I.getText(),color:I.getTextColor() || I.getColor(),className:I.getClassName()};
    var H = this.paintTapeIconLabel(I.getLatestStart(), C, E, F, K, G, B, A);
    var J = this;
    var D = F != null ? function(M, L, N)
    {
        return J._onClickInstantEvent(H.iconElmtData.elmt, L, I);
    } : function(M, L, N)
    {
        return J._onClickInstantEvent(H.labelElmtData.elmt, L, I);
    };
    SimileAjax.DOM.registerEvent(H.labelElmtData.elmt, "mousedown", D);
    SimileAjax.DOM.registerEvent(H.tapeElmtData.elmt, "mousedown", D);
    if (F != null)
    {
        SimileAjax.DOM.registerEvent(H.iconElmtData.elmt, "mousedown", D);
        this._eventIdToElmt[I.getID()] = H.iconElmtData.elmt;
    }
    else
    {
        this._eventIdToElmt[I.getID()] = H.labelElmtData.elmt;
    }
};
Timeline.CompactEventPainter.prototype.paintTapeIconLabel = function(V, O, S, I, a, X, c, Z)
{
    var R = this._band;
    var F = function(e)
    {
        return Math.round(R.dateToPixelOffset(e));
    };
    var d = F(V);
    var W = [];
    var b = 0;
    var B = 0;
    var C = 0;
    if (S != null)
    {
        b = X.tapeHeight + X.tapeBottomMargin;
        B = Math.ceil(X.tapeHeight / X.trackHeight);
        var A = F(S.end) - d;
        var L = F(S.start) - d;
        for (var Q = 0;
             Q < B;
             Q++)
        {
            W.push({start:L,end:A});
        }
        C = X.trackHeight - (b % X.tapeHeight);
    }
    var N = 0;
    var U = 0;
    if (I != null)
    {
        if ("iconAlign" in I && I.iconAlign == "center")
        {
            N = -Math.floor(I.width / 2);
        }
        U = N + I.width + X.iconLabelGap;
        if (B > 0)
        {
            W[B - 1].end = Math.max(W[B - 1].end, U);
        }
        var E = I.height + X.iconBottomMargin + C;
        while (E > 0)
        {
            W.push({start:N,end:U});
            E -= X.trackHeight;
        }
    }
    var P = a.text;
    var H = this._frc.computeSize(P);
    var M = H.height + X.labelBottomMargin + C;
    var J = U + H.width + X.labelRightMargin;
    if (B > 0)
    {
        W[B - 1].end = Math.max(W[B - 1].end, J);
    }
    for (var Y = 0;
         M > 0;
         Y++)
    {
        if (B + Y < W.length)
        {
            var T = W[B + Y];
            T.end = J;
        }
        else
        {
            W.push({start:0,end:J});
        }
        M -= X.trackHeight;
    }
    var G = this._fitTracks(d, W);
    var K = G * X.trackHeight + X.trackOffset;
    var D = {};
    D.labelElmtData = this._paintEventLabel(O, a, d + U, K + b, H.width, H.height, c);
    if (S != null)
    {
        if ("latestStart" in S || "earliestEnd" in S)
        {
            D.impreciseTapeElmtData = this._paintEventTape(O, S, X.tapeHeight, K, F(S.start), F(S.end), c.event.duration.impreciseColor, c.event.duration.impreciseOpacity, X, c);
        }
        if (!S.isInstant && "start" in S && "end" in S)
        {
            D.tapeElmtData = this._paintEventTape(O, S, X.tapeHeight, K, d, F("earliestEnd" in S ? S.earliestEnd : S.end), S.color, 100, X, c);
        }
    }
    if (I != null)
    {
        D.iconElmtData = this._paintEventIcon(O, I, K + b, d + N, X, c);
    }
    return D;
};
Timeline.CompactEventPainter.prototype._fitTracks = function(F, C)
{
    var H;
    for (H = 0;
         H < this._tracks.length;
         H++)
    {
        var E = true;
        for (var B = 0;
             B < C.length && (H + B) < this._tracks.length;
             B++)
        {
            var G = this._tracks[H + B];
            var A = C[B];
            if (F + A.start < G)
            {
                E = false;
                break;
            }
        }
        if (E)
        {
            break;
        }
    }
    for (var D = 0;
         D < C.length;
         D++)
    {
        this._tracks[H + D] = F + C[D].end;
    }
    return H;
};
Timeline.CompactEventPainter.prototype._paintEventIcon = function(C, D, H, G, E, F)
{
    var B = SimileAjax.Graphics.createTranslucentImage(D.url);
    var A = this._timeline.getDocument().createElement("div");
    A.className = "timeline-event-icon" + ("className" in D ? (" " + D.className) : "");
    A.style.left = G + "px";
    A.style.top = H + "px";
    A.appendChild(B);
    if ("tooltip" in C && typeof C.tooltip == "string")
    {
        A.title = C.tooltip;
    }
    this._eventLayer.appendChild(A);
    return{left:G,top:H,width:E.iconWidth,height:E.iconHeight,elmt:A};
};
Timeline.CompactEventPainter.prototype._paintEventLabel = function(E, I, C, F, A, G, D)
{
    var H = this._timeline.getDocument();
    var B = H.createElement("div");
    B.className = "timeline-event-label";
    B.style.left = C + "px";
    B.style.width = (A + 1) + "px";
    B.style.top = F + "px";
    B.innerHTML = I.text;
    if ("tooltip" in E && typeof E.tooltip == "string")
    {
        B.title = E.tooltip;
    }
    if ("color" in I && typeof I.color == "string")
    {
        B.style.color = I.color;
    }
    if ("className" in I && typeof I.className == "string")
    {
        B.className += " " + I.className;
    }
    this._eventLayer.appendChild(B);
    return{left:C,top:F,width:A,height:G,elmt:B};
};
Timeline.CompactEventPainter.prototype._paintEventTape = function(G, H, K, J, D, A, E, C, I, F)
{
    var B = A - D;
    var L = this._timeline.getDocument().createElement("div");
    L.className = "timeline-event-tape";
    L.style.left = D + "px";
    L.style.top = J + "px";
    L.style.width = B + "px";
    L.style.height = K + "px";
    if ("tooltip" in G && typeof G.tooltip == "string")
    {
        L.title = G.tooltip;
    }
    if (E != null && typeof H.color == "string")
    {
        L.style.backgroundColor = E;
    }
    if ("backgroundImage" in H && typeof H.backgroundImage == "string")
    {
        L.style.backgroundImage = "url(" + backgroundImage + ")";
        L.style.backgroundRepeat = ("backgroundRepeat" in H && typeof H.backgroundRepeat == "string") ? H.backgroundRepeat : "repeat";
    }
    SimileAjax.Graphics.setOpacity(L, C);
    if ("className" in H && typeof H.className == "string")
    {
        L.className += " " + H.className;
    }
    this._eventLayer.appendChild(L);
    return{left:D,top:J,width:B,height:K,elmt:L};
};
Timeline.CompactEventPainter.prototype._createHighlightDiv = function(A, C, E)
{
    if (A >= 0)
    {
        var D = this._timeline.getDocument();
        var G = E.event;
        var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
        var F = D.createElement("div");
        F.style.position = "absolute";
        F.style.overflow = "hidden";
        F.style.left = (C.left - 2) + "px";
        F.style.width = (C.width + 4) + "px";
        F.style.top = (C.top - 2) + "px";
        F.style.height = (C.height + 4) + "px";
        this._highlightLayer.appendChild(F);
    }
};
Timeline.CompactEventPainter.prototype._onClickMultiplePreciseInstantEvent = function(E, A, B)
{
    var F = SimileAjax.DOM.getPageCoordinates(E);
    this._showBubble(F.left + Math.ceil(E.offsetWidth / 2), F.top + Math.ceil(E.offsetHeight / 2), B);
    var D = [];
    for (var C = 0;
         C < B.length;
         C++)
    {
        D.push(B[C].getID());
    }
    this._fireOnSelect(D);
    A.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(A);
    return false;
};
Timeline.CompactEventPainter.prototype._onClickInstantEvent = function(C, A, B)
{
    var D = SimileAjax.DOM.getPageCoordinates(C);
    this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top + Math.ceil(C.offsetHeight / 2), [B]);
    this._fireOnSelect([B.getID()]);
    A.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(A);
    return false;
};
Timeline.CompactEventPainter.prototype._onClickDurationEvent = function(F, B, C)
{
    if ("pageX" in B)
    {
        var A = B.pageX;
        var E = B.pageY;
    }
    else
    {
        var D = SimileAjax.DOM.getPageCoordinates(F);
        var A = B.offsetX + D.left;
        var E = B.offsetY + D.top;
    }
    this._showBubble(A, E, [C]);
    this._fireOnSelect([C.getID()]);
    B.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(B);
    return false;
};
Timeline.CompactEventPainter.prototype.showBubble = function(A)
{
    var B = this._eventIdToElmt[A.getID()];
    if (B)
    {
        var C = SimileAjax.DOM.getPageCoordinates(B);
        this._showBubble(C.left + B.offsetWidth / 2, C.top + B.offsetHeight / 2, [A]);
    }
};
Timeline.CompactEventPainter.prototype._showBubble = function(A, F, B)
{
    var E = document.createElement("div");
    B = ("fillInfoBubble" in B) ? [B] : B;
    for (var D = 0;
         D < B.length;
         D++)
    {
        var C = document.createElement("div");
        E.appendChild(C);
        B[D].fillInfoBubble(C, this._params.theme, this._band.getLabeller());
    }
    SimileAjax.WindowManager.cancelPopups();
    SimileAjax.Graphics.createBubbleForContentAndPoint(E, A, F, this._params.theme.event.bubble.width);
};
Timeline.CompactEventPainter.prototype._fireOnSelect = function(B)
{
    for (var A = 0;
         A < this._onSelectListeners.length;
         A++)
    {
        this._onSelectListeners[A](B);
    }
};


/* decorators.js */
Timeline.SpanHighlightDecorator = function(A)
{
    this._unit = A.unit != null ? A.unit : SimileAjax.NativeDateUnit;
    this._startDate = (typeof A.startDate == "string") ? this._unit.parseFromObject(A.startDate) : A.startDate;
    this._endDate = (typeof A.endDate == "string") ? this._unit.parseFromObject(A.endDate) : A.endDate;
    this._startLabel = A.startLabel != null ? A.startLabel : "";
    this._endLabel = A.endLabel != null ? A.endLabel : "";
    this._color = A.color;
    this._cssClass = A.cssClass != null ? A.cssClass : null;
    this._opacity = A.opacity != null ? A.opacity : 100;
    this._zIndex = (A.inFront != null && A.inFront) ? 113 : 10;
};
Timeline.SpanHighlightDecorator.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._layerDiv = null;
};
Timeline.SpanHighlightDecorator.prototype.paint = function()
{
    if (this._layerDiv != null)
    {
        this._band.removeLayerDiv(this._layerDiv);
    }
    this._layerDiv = this._band.createLayerDiv(this._zIndex);
    this._layerDiv.setAttribute("name", "span-highlight-decorator");
    this._layerDiv.style.display = "none";
    var E = this._band.getMinDate();
    var A = this._band.getMaxDate();
    if (this._unit.compare(this._startDate, A) < 0 && this._unit.compare(this._endDate, E) > 0)
    {
        E = this._unit.later(E, this._startDate);
        A = this._unit.earlier(A, this._endDate);
        var F = this._band.dateToPixelOffset(E);
        var I = this._band.dateToPixelOffset(A);
        var H = this._timeline.getDocument();
        var K = function()
        {
            var L = H.createElement("table");
            L.insertRow(0).insertCell(0);
            return L;
        };
        var B = H.createElement("div");
        B.className = "timeline-highlight-decorator";
        if (this._cssClass)
        {
            B.className += " " + this._cssClass;
        }
        if (this._color != null)
        {
            B.style.backgroundColor = this._color;
        }
        if (this._opacity < 100)
        {
            SimileAjax.Graphics.setOpacity(B, this._opacity);
        }
        this._layerDiv.appendChild(B);
        var J = K();
        J.className = "timeline-highlight-label timeline-highlight-label-start";
        var C = J.rows[0].cells[0];
        C.innerHTML = this._startLabel;
        if (this._cssClass)
        {
            C.className = "label_" + this._cssClass;
        }
        this._layerDiv.appendChild(J);
        var G = K();
        G.className = "timeline-highlight-label timeline-highlight-label-end";
        var D = G.rows[0].cells[0];
        D.innerHTML = this._endLabel;
        if (this._cssClass)
        {
            D.className = "label_" + this._cssClass;
        }
        this._layerDiv.appendChild(G);
        if (this._timeline.isHorizontal())
        {
            B.style.left = F + "px";
            B.style.width = (I - F) + "px";
            J.style.right = (this._band.getTotalViewLength() - F) + "px";
            J.style.width = (this._startLabel.length) + "em";
            G.style.left = I + "px";
            G.style.width = (this._endLabel.length) + "em";
        }
        else
        {
            B.style.top = F + "px";
            B.style.height = (I - F) + "px";
            J.style.bottom = F + "px";
            J.style.height = "1.5px";
            G.style.top = I + "px";
            G.style.height = "1.5px";
        }
    }
    this._layerDiv.style.display = "block";
};
Timeline.SpanHighlightDecorator.prototype.softPaint = function()
{
};
Timeline.PointHighlightDecorator = function(A)
{
    this._unit = A.unit != null ? A.unit : SimileAjax.NativeDateUnit;
    this._date = (typeof A.date == "string") ? this._unit.parseFromObject(A.date) : A.date;
    this._width = A.width != null ? A.width : 10;
    this._color = A.color;
    this._cssClass = A.cssClass != null ? A.cssClass : "";
    this._opacity = A.opacity != null ? A.opacity : 100;
};
Timeline.PointHighlightDecorator.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._layerDiv = null;
};
Timeline.PointHighlightDecorator.prototype.paint = function()
{
    if (this._layerDiv != null)
    {
        this._band.removeLayerDiv(this._layerDiv);
    }
    this._layerDiv = this._band.createLayerDiv(10);
    this._layerDiv.setAttribute("name", "span-highlight-decorator");
    this._layerDiv.style.display = "none";
    var C = this._band.getMinDate();
    var E = this._band.getMaxDate();
    if (this._unit.compare(this._date, E) < 0 && this._unit.compare(this._date, C) > 0)
    {
        var A = this._band.dateToPixelOffset(this._date);
        var B = A - Math.round(this._width / 2);
        var D = this._timeline.getDocument();
        var F = D.createElement("div");
        F.className = "timeline-highlight-point-decorator";
        F.className += " " + this._cssClass;
        if (this._color != null)
        {
            F.style.backgroundColor = this._color;
        }
        if (this._opacity < 100)
        {
            SimileAjax.Graphics.setOpacity(F, this._opacity);
        }
        this._layerDiv.appendChild(F);
        if (this._timeline.isHorizontal())
        {
            F.style.left = B + "px";
            F.style.width = this._width;
        }
        else
        {
            F.style.top = B + "px";
            F.style.height = this._width;
        }
    }
    this._layerDiv.style.display = "block";
};
Timeline.PointHighlightDecorator.prototype.softPaint = function()
{
};


/* detailed-painter.js */
Timeline.DetailedEventPainter = function(A)
{
    this._params = A;
    this._onSelectListeners = [];
    this._filterMatcher = null;
    this._highlightMatcher = null;
    this._frc = null;
    this._eventIdToElmt = {};
};
Timeline.DetailedEventPainter.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._backLayer = null;
    this._eventLayer = null;
    this._lineLayer = null;
    this._highlightLayer = null;
    this._eventIdToElmt = null;
};
Timeline.DetailedEventPainter.prototype.getType = function()
{
    return"detailed";
};
Timeline.DetailedEventPainter.prototype.addOnSelectListener = function(A)
{
    this._onSelectListeners.push(A);
};
Timeline.DetailedEventPainter.prototype.removeOnSelectListener = function(B)
{
    for (var A = 0;
         A < this._onSelectListeners.length;
         A++)
    {
        if (this._onSelectListeners[A] == B)
        {
            this._onSelectListeners.splice(A, 1);
            break;
        }
    }
};
Timeline.DetailedEventPainter.prototype.getFilterMatcher = function()
{
    return this._filterMatcher;
};
Timeline.DetailedEventPainter.prototype.setFilterMatcher = function(A)
{
    this._filterMatcher = A;
};
Timeline.DetailedEventPainter.prototype.getHighlightMatcher = function()
{
    return this._highlightMatcher;
};
Timeline.DetailedEventPainter.prototype.setHighlightMatcher = function(A)
{
    this._highlightMatcher = A;
};
Timeline.DetailedEventPainter.prototype.paint = function()
{
    var C = this._band.getEventSource();
    if (C == null)
    {
        return;
    }
    this._eventIdToElmt = {};
    this._prepareForPainting();
    var I = this._params.theme.event;
    var G = Math.max(I.track.height, this._frc.getLineHeight());
    var F = {trackOffset:Math.round(this._band.getViewWidth() / 2 - G / 2),trackHeight:G,trackGap:I.track.gap,trackIncrement:G + I.track.gap,icon:I.instant.icon,iconWidth:I.instant.iconWidth,iconHeight:I.instant.iconHeight,labelWidth:I.label.width};
    var D = this._band.getMinDate();
    var B = this._band.getMaxDate();
    var J = (this._filterMatcher != null) ? this._filterMatcher : function(K)
    {
        return true;
    };
    var A = (this._highlightMatcher != null) ? this._highlightMatcher : function(K)
    {
        return -1;
    };
    var E = C.getEventReverseIterator(D, B);
    while (E.hasNext())
    {
        var H = E.next();
        if (J(H))
        {
            this.paintEvent(H, F, this._params.theme, A(H));
        }
    }
    this._highlightLayer.style.display = "block";
    this._lineLayer.style.display = "block";
    this._eventLayer.style.display = "block";
    this._band.updateEventTrackInfo(this._lowerTracks.length + this._upperTracks.length, F.trackIncrement);
};
Timeline.DetailedEventPainter.prototype.softPaint = function()
{
};
Timeline.DetailedEventPainter.prototype._prepareForPainting = function()
{
    var B = this._band;
    if (this._backLayer == null)
    {
        this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
        this._backLayer.style.visibility = "hidden";
        var A = document.createElement("span");
        A.className = "timeline-event-label";
        this._backLayer.appendChild(A);
        this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
    }
    this._frc.update();
    this._lowerTracks = [];
    this._upperTracks = [];
    if (this._highlightLayer != null)
    {
        B.removeLayerDiv(this._highlightLayer);
    }
    this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
    this._highlightLayer.style.display = "none";
    if (this._lineLayer != null)
    {
        B.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
    this._lineLayer.style.display = "none";
    if (this._eventLayer != null)
    {
        B.removeLayerDiv(this._eventLayer);
    }
    this._eventLayer = B.createLayerDiv(110, "timeline-band-events");
    this._eventLayer.style.display = "none";
};
Timeline.DetailedEventPainter.prototype.paintEvent = function(B, C, D, A)
{
    if (B.isInstant())
    {
        this.paintInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintDurationEvent(B, C, D, A);
    }
};
Timeline.DetailedEventPainter.prototype.paintInstantEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseInstantEvent(B, C, D, A);
    }
};
Timeline.DetailedEventPainter.prototype.paintDurationEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseDurationEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseDurationEvent(B, C, D, A);
    }
};
Timeline.DetailedEventPainter.prototype.paintPreciseInstantEvent = function(L, P, S, Q)
{
    var T = this._timeline.getDocument();
    var J = L.getText();
    var G = L.getStart();
    var H = Math.round(this._band.dateToPixelOffset(G));
    var A = Math.round(H + P.iconWidth / 2);
    var C = Math.round(H - P.iconWidth / 2);
    var E = this._frc.computeSize(J);
    var F = this._findFreeTrackForSolid(A, H);
    var B = this._paintEventIcon(L, F, C, P, S);
    var K = A + S.event.label.offsetFromLine;
    var O = F;
    var D = this._getTrackData(F);
    if (Math.min(D.solid, D.text) >= K + E.width)
    {
        D.solid = C;
        D.text = K;
    }
    else
    {
        D.solid = C;
        K = H + S.event.label.offsetFromLine;
        O = this._findFreeTrackForText(F, K + E.width, function(U)
        {
            U.line = H - 2;
        });
        this._getTrackData(O).text = C;
        this._paintEventLine(L, H, F, O, P, S);
    }
    var N = Math.round(P.trackOffset + O * P.trackIncrement + P.trackHeight / 2 - E.height / 2);
    var R = this._paintEventLabel(L, J, K, N, E.width, E.height, S);
    var M = this;
    var I = function(V, U, W)
    {
        return M._onClickInstantEvent(B.elmt, U, L);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", I);
    SimileAjax.DOM.registerEvent(R.elmt, "mousedown", I);
    this._createHighlightDiv(Q, B, S);
    this._eventIdToElmt[L.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseInstantEvent = function(O, S, W, T)
{
    var X = this._timeline.getDocument();
    var M = O.getText();
    var I = O.getStart();
    var U = O.getEnd();
    var K = Math.round(this._band.dateToPixelOffset(I));
    var B = Math.round(this._band.dateToPixelOffset(U));
    var A = Math.round(K + S.iconWidth / 2);
    var D = Math.round(K - S.iconWidth / 2);
    var G = this._frc.computeSize(M);
    var H = this._findFreeTrackForSolid(B, K);
    var E = this._paintEventTape(O, H, K, B, W.event.instant.impreciseColor, W.event.instant.impreciseOpacity, S, W);
    var C = this._paintEventIcon(O, H, D, S, W);
    var F = this._getTrackData(H);
    F.solid = D;
    var N = A + W.event.label.offsetFromLine;
    var J = N + G.width;
    var R;
    if (J < B)
    {
        R = H;
    }
    else
    {
        N = K + W.event.label.offsetFromLine;
        J = N + G.width;
        R = this._findFreeTrackForText(H, J, function(Y)
        {
            Y.line = K - 2;
        });
        this._getTrackData(R).text = D;
        this._paintEventLine(O, K, H, R, S, W);
    }
    var Q = Math.round(S.trackOffset + R * S.trackIncrement + S.trackHeight / 2 - G.height / 2);
    var V = this._paintEventLabel(O, M, N, Q, G.width, G.height, W);
    var P = this;
    var L = function(Z, Y, a)
    {
        return P._onClickInstantEvent(C.elmt, Y, O);
    };
    SimileAjax.DOM.registerEvent(C.elmt, "mousedown", L);
    SimileAjax.DOM.registerEvent(E.elmt, "mousedown", L);
    SimileAjax.DOM.registerEvent(V.elmt, "mousedown", L);
    this._createHighlightDiv(T, C, W);
    this._eventIdToElmt[O.getID()] = C.elmt;
};
Timeline.DetailedEventPainter.prototype.paintPreciseDurationEvent = function(K, O, T, Q)
{
    var U = this._timeline.getDocument();
    var I = K.getText();
    var E = K.getStart();
    var R = K.getEnd();
    var F = Math.round(this._band.dateToPixelOffset(E));
    var A = Math.round(this._band.dateToPixelOffset(R));
    var C = this._frc.computeSize(I);
    var D = this._findFreeTrackForSolid(A);
    var P = K.getColor();
    P = P != null ? P : T.event.duration.color;
    var B = this._paintEventTape(K, D, F, A, P, 100, O, T);
    var H = this._getTrackData(D);
    H.solid = F;
    var J = F + T.event.label.offsetFromLine;
    var N = this._findFreeTrackForText(D, J + C.width, function(V)
    {
        V.line = F - 2;
    });
    this._getTrackData(N).text = F - 2;
    this._paintEventLine(K, F, D, N, O, T);
    var M = Math.round(O.trackOffset + N * O.trackIncrement + O.trackHeight / 2 - C.height / 2);
    var S = this._paintEventLabel(K, I, J, M, C.width, C.height, T);
    var L = this;
    var G = function(W, V, X)
    {
        return L._onClickDurationEvent(B.elmt, V, K);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", G);
    SimileAjax.DOM.registerEvent(S.elmt, "mousedown", G);
    this._createHighlightDiv(Q, B, T);
    this._eventIdToElmt[K.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype.paintImpreciseDurationEvent = function(M, T, Y, V)
{
    var Z = this._timeline.getDocument();
    var K = M.getText();
    var G = M.getStart();
    var S = M.getLatestStart();
    var W = M.getEnd();
    var O = M.getEarliestEnd();
    var H = Math.round(this._band.dateToPixelOffset(G));
    var E = Math.round(this._band.dateToPixelOffset(S));
    var A = Math.round(this._band.dateToPixelOffset(W));
    var F = Math.round(this._band.dateToPixelOffset(O));
    var C = this._frc.computeSize(K);
    var D = this._findFreeTrackForSolid(A);
    var U = M.getColor();
    U = U != null ? U : Y.event.duration.color;
    var R = this._paintEventTape(M, D, H, A, Y.event.duration.impreciseColor, Y.event.duration.impreciseOpacity, T, Y);
    var B = this._paintEventTape(M, D, E, F, U, 100, T, Y);
    var J = this._getTrackData(D);
    J.solid = H;
    var L = E + Y.event.label.offsetFromLine;
    var Q = this._findFreeTrackForText(D, L + C.width, function(a)
    {
        a.line = E - 2;
    });
    this._getTrackData(Q).text = E - 2;
    this._paintEventLine(M, E, D, Q, T, Y);
    var P = Math.round(T.trackOffset + Q * T.trackIncrement + T.trackHeight / 2 - C.height / 2);
    var X = this._paintEventLabel(M, K, L, P, C.width, C.height, Y);
    var N = this;
    var I = function(b, a, c)
    {
        return N._onClickDurationEvent(B.elmt, a, M);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", I);
    SimileAjax.DOM.registerEvent(X.elmt, "mousedown", I);
    this._createHighlightDiv(V, B, Y);
    this._eventIdToElmt[M.getID()] = B.elmt;
};
Timeline.DetailedEventPainter.prototype._findFreeTrackForSolid = function(D, A)
{
    for (var C = 0;
         true;
         C++)
    {
        if (C < this._lowerTracks.length)
        {
            var B = this._lowerTracks[C];
            if (Math.min(B.solid, B.text) > D && (!(A) || B.line > A))
            {
                return C;
            }
        }
        else
        {
            this._lowerTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
            return C;
        }
        if (C < this._upperTracks.length)
        {
            var B = this._upperTracks[C];
            if (Math.min(B.solid, B.text) > D && (!(A) || B.line > A))
            {
                return -1 - C;
            }
        }
        else
        {
            this._upperTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
            return -1 - C;
        }
    }
};
Timeline.DetailedEventPainter.prototype._findFreeTrackForText = function(C, A, I)
{
    var B;
    var E;
    var F;
    var H;
    if (C < 0)
    {
        B = true;
        F = -C;
        E = this._findFreeUpperTrackForText(F, A);
        H = -1 - E;
    }
    else
    {
        if (C > 0)
        {
            B = false;
            F = C + 1;
            E = this._findFreeLowerTrackForText(F, A);
            H = E;
        }
        else
        {
            var G = this._findFreeUpperTrackForText(0, A);
            var J = this._findFreeLowerTrackForText(1, A);
            if (J - 1 <= G)
            {
                B = false;
                F = 1;
                E = J;
                H = E;
            }
            else
            {
                B = true;
                F = 0;
                E = G;
                H = -1 - E;
            }
        }
    }
    if (B)
    {
        if (E == this._upperTracks.length)
        {
            this._upperTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
        }
        for (var D = F;
             D < E;
             D++)
        {
            I(this._upperTracks[D]);
        }
    }
    else
    {
        if (E == this._lowerTracks.length)
        {
            this._lowerTracks.push({solid:Number.POSITIVE_INFINITY,text:Number.POSITIVE_INFINITY,line:Number.POSITIVE_INFINITY});
        }
        for (var D = F;
             D < E;
             D++)
        {
            I(this._lowerTracks[D]);
        }
    }
    return H;
};
Timeline.DetailedEventPainter.prototype._findFreeLowerTrackForText = function(A, C)
{
    for (;
            A < this._lowerTracks.length;
            A++)
    {
        var B = this._lowerTracks[A];
        if (Math.min(B.solid, B.text) >= C)
        {
            break;
        }
    }
    return A;
};
Timeline.DetailedEventPainter.prototype._findFreeUpperTrackForText = function(A, C)
{
    for (;
            A < this._upperTracks.length;
            A++)
    {
        var B = this._upperTracks[A];
        if (Math.min(B.solid, B.text) >= C)
        {
            break;
        }
    }
    return A;
};
Timeline.DetailedEventPainter.prototype._getTrackData = function(A)
{
    return(A < 0) ? this._upperTracks[-A - 1] : this._lowerTracks[A];
};
Timeline.DetailedEventPainter.prototype._paintEventLine = function(J, E, D, A, G, F)
{
    var H = Math.round(G.trackOffset + D * G.trackIncrement + G.trackHeight / 2);
    var I = Math.round(Math.abs(A - D) * G.trackIncrement);
    var C = "1px solid " + F.event.label.lineColor;
    var B = this._timeline.getDocument().createElement("div");
    B.style.position = "absolute";
    B.style.left = E + "px";
    B.style.width = F.event.label.offsetFromLine + "px";
    B.style.height = I + "px";
    if (D > A)
    {
        B.style.top = (H - I) + "px";
        B.style.borderTop = C;
    }
    else
    {
        B.style.top = H + "px";
        B.style.borderBottom = C;
    }
    B.style.borderLeft = C;
    this._lineLayer.appendChild(B);
};
Timeline.DetailedEventPainter.prototype._paintEventIcon = function(J, B, C, F, E)
{
    var H = J.getIcon();
    H = H != null ? H : F.icon;
    var G = F.trackOffset + B * F.trackIncrement + F.trackHeight / 2;
    var I = Math.round(G - F.iconHeight / 2);
    var D = SimileAjax.Graphics.createTranslucentImage(H);
    var A = this._timeline.getDocument().createElement("div");
    A.style.position = "absolute";
    A.style.left = C + "px";
    A.style.top = I + "px";
    A.appendChild(D);
    A.style.cursor = "pointer";
    if (J._title != null)
    {
        A.title = J._title;
    }
    this._eventLayer.appendChild(A);
    return{left:C,top:I,width:F.iconWidth,height:F.iconHeight,elmt:A};
};
Timeline.DetailedEventPainter.prototype._paintEventLabel = function(I, J, C, F, A, G, E)
{
    var H = this._timeline.getDocument();
    var K = H.createElement("div");
    K.style.position = "absolute";
    K.style.left = C + "px";
    K.style.width = A + "px";
    K.style.top = F + "px";
    K.style.height = G + "px";
    K.style.backgroundColor = E.event.label.backgroundColor;
    SimileAjax.Graphics.setOpacity(K, E.event.label.backgroundOpacity);
    this._eventLayer.appendChild(K);
    var B = H.createElement("div");
    B.style.position = "absolute";
    B.style.left = C + "px";
    B.style.width = A + "px";
    B.style.top = F + "px";
    B.innerHTML = J;
    B.style.cursor = "pointer";
    if (I._title != null)
    {
        B.title = I._title;
    }
    var D = I.getTextColor();
    if (D == null)
    {
        D = I.getColor();
    }
    if (D != null)
    {
        B.style.color = D;
    }
    this._eventLayer.appendChild(B);
    return{left:C,top:F,width:A,height:G,elmt:B};
};
Timeline.DetailedEventPainter.prototype._paintEventTape = function(L, B, D, A, G, C, I, H)
{
    var F = A - D;
    var E = H.event.tape.height;
    var K = I.trackOffset + B * I.trackIncrement + I.trackHeight / 2;
    var J = Math.round(K - E / 2);
    var M = this._timeline.getDocument().createElement("div");
    M.style.position = "absolute";
    M.style.left = D + "px";
    M.style.width = F + "px";
    M.style.top = J + "px";
    M.style.height = E + "px";
    M.style.backgroundColor = G;
    M.style.overflow = "hidden";
    M.style.cursor = "pointer";
    if (L._title != null)
    {
        M.title = L._title;
    }
    SimileAjax.Graphics.setOpacity(M, C);
    this._eventLayer.appendChild(M);
    return{left:D,top:J,width:F,height:E,elmt:M};
};
Timeline.DetailedEventPainter.prototype._createHighlightDiv = function(A, C, E)
{
    if (A >= 0)
    {
        var D = this._timeline.getDocument();
        var G = E.event;
        var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
        var F = D.createElement("div");
        F.style.position = "absolute";
        F.style.overflow = "hidden";
        F.style.left = (C.left - 2) + "px";
        F.style.width = (C.width + 4) + "px";
        F.style.top = (C.top - 2) + "px";
        F.style.height = (C.height + 4) + "px";
        F.style.background = B;
        this._highlightLayer.appendChild(F);
    }
};
Timeline.DetailedEventPainter.prototype._onClickInstantEvent = function(C, A, B)
{
    var D = SimileAjax.DOM.getPageCoordinates(C);
    this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top + Math.ceil(C.offsetHeight / 2), B);
    this._fireOnSelect(B.getID());
    A.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(A);
    return false;
};
Timeline.DetailedEventPainter.prototype._onClickDurationEvent = function(F, B, C)
{
    if ("pageX" in B)
    {
        var A = B.pageX;
        var E = B.pageY;
    }
    else
    {
        var D = SimileAjax.DOM.getPageCoordinates(F);
        var A = B.offsetX + D.left;
        var E = B.offsetY + D.top;
    }
    this._showBubble(A, E, C);
    this._fireOnSelect(C.getID());
    B.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(B);
    return false;
};
Timeline.DetailedEventPainter.prototype.showBubble = function(A)
{
    var B = this._eventIdToElmt[A.getID()];
    if (B)
    {
        var C = SimileAjax.DOM.getPageCoordinates(B);
        this._showBubble(C.left + B.offsetWidth / 2, C.top + B.offsetHeight / 2, A);
    }
};
Timeline.DetailedEventPainter.prototype._showBubble = function(B, E, C)
{
    var D = document.createElement("div");
    var A = this._params.theme.event.bubble;
    C.fillInfoBubble(D, this._params.theme, this._band.getLabeller());
    SimileAjax.WindowManager.cancelPopups();
    SimileAjax.Graphics.createBubbleForContentAndPoint(D, B, E, A.width, null, A.maxHeight);
};
Timeline.DetailedEventPainter.prototype._fireOnSelect = function(A)
{
    for (var B = 0;
         B < this._onSelectListeners.length;
         B++)
    {
        this._onSelectListeners[B](A);
    }
};


/* ether-painters.js */
Timeline.GregorianEtherPainter = function(A)
{
    this._params = A;
    this._theme = A.theme;
    this._unit = A.unit;
    this._multiple = ("multiple" in A) ? A.multiple : 1;
};
Timeline.GregorianEtherPainter.prototype.initialize = function(C, B)
{
    this._band = C;
    this._timeline = B;
    this._backgroundLayer = C.createLayerDiv(0);
    this._backgroundLayer.setAttribute("name", "ether-background");
    this._backgroundLayer.className = "timeline-ether-bg";
    this._markerLayer = null;
    this._lineLayer = null;
    var D = ("align" in this._params && this._params.align != undefined) ? this._params.align : this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign" : "vAlign"];
    var A = ("showLine" in this._params) ? this._params.showLine : this._theme.ether.interval.line.show;
    this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(this._timeline, this._band, this._theme, D, A);
    this._highlight = new Timeline.EtherHighlight(this._timeline, this._band, this._theme, this._backgroundLayer);
};
Timeline.GregorianEtherPainter.prototype.setHighlight = function(A, B)
{
    this._highlight.position(A, B);
};
Timeline.GregorianEtherPainter.prototype.paint = function()
{
    if (this._markerLayer)
    {
        this._band.removeLayerDiv(this._markerLayer);
    }
    this._markerLayer = this._band.createLayerDiv(100);
    this._markerLayer.setAttribute("name", "ether-markers");
    this._markerLayer.style.display = "none";
    if (this._lineLayer)
    {
        this._band.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = this._band.createLayerDiv(1);
    this._lineLayer.setAttribute("name", "ether-lines");
    this._lineLayer.style.display = "none";
    var C = this._band.getMinDate();
    var F = this._band.getMaxDate();
    var A = this._band.getTimeZone();
    var E = this._band.getLabeller();
    SimileAjax.DateTime.roundDownToInterval(C, this._unit, A, this._multiple, this._theme.firstDayOfWeek);
    var D = this;
    var B = function(G)
    {
        for (var H = 0;
             H < D._multiple;
             H++)
        {
            SimileAjax.DateTime.incrementByInterval(G, D._unit);
        }
    };
    while (C.getTime() < F.getTime())
    {
        this._intervalMarkerLayout.createIntervalMarker(C, E, this._unit, this._markerLayer, this._lineLayer);
        B(C);
    }
    this._markerLayer.style.display = "block";
    this._lineLayer.style.display = "block";
};
Timeline.GregorianEtherPainter.prototype.softPaint = function()
{
};
Timeline.GregorianEtherPainter.prototype.zoom = function(A)
{
    if (A != 0)
    {
        this._unit += A;
    }
};
Timeline.HotZoneGregorianEtherPainter = function(G)
{
    this._params = G;
    this._theme = G.theme;
    this._zones = [
        {startTime:Number.NEGATIVE_INFINITY,endTime:Number.POSITIVE_INFINITY,unit:G.unit,multiple:1}
    ];
    for (var F = 0;
         F < G.zones.length;
         F++)
    {
        var C = G.zones[F];
        var E = SimileAjax.DateTime.parseGregorianDateTime(C.start).getTime();
        var B = SimileAjax.DateTime.parseGregorianDateTime(C.end).getTime();
        for (var D = 0;
             D < this._zones.length && B > E;
             D++)
        {
            var A = this._zones[D];
            if (E < A.endTime)
            {
                if (E > A.startTime)
                {
                    this._zones.splice(D, 0, {startTime:A.startTime,endTime:E,unit:A.unit,multiple:A.multiple});
                    D++;
                    A.startTime = E;
                }
                if (B < A.endTime)
                {
                    this._zones.splice(D, 0, {startTime:E,endTime:B,unit:C.unit,multiple:(C.multiple) ? C.multiple : 1});
                    D++;
                    A.startTime = B;
                    E = B;
                }
                else
                {
                    A.multiple = C.multiple;
                    A.unit = C.unit;
                    E = A.endTime;
                }
            }
        }
    }
};
Timeline.HotZoneGregorianEtherPainter.prototype.initialize = function(C, B)
{
    this._band = C;
    this._timeline = B;
    this._backgroundLayer = C.createLayerDiv(0);
    this._backgroundLayer.setAttribute("name", "ether-background");
    this._backgroundLayer.className = "timeline-ether-bg";
    this._markerLayer = null;
    this._lineLayer = null;
    var D = ("align" in this._params && this._params.align != undefined) ? this._params.align : this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign" : "vAlign"];
    var A = ("showLine" in this._params) ? this._params.showLine : this._theme.ether.interval.line.show;
    this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(this._timeline, this._band, this._theme, D, A);
    this._highlight = new Timeline.EtherHighlight(this._timeline, this._band, this._theme, this._backgroundLayer);
};
Timeline.HotZoneGregorianEtherPainter.prototype.setHighlight = function(A, B)
{
    this._highlight.position(A, B);
};
Timeline.HotZoneGregorianEtherPainter.prototype.paint = function()
{
    if (this._markerLayer)
    {
        this._band.removeLayerDiv(this._markerLayer);
    }
    this._markerLayer = this._band.createLayerDiv(100);
    this._markerLayer.setAttribute("name", "ether-markers");
    this._markerLayer.style.display = "none";
    if (this._lineLayer)
    {
        this._band.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = this._band.createLayerDiv(1);
    this._lineLayer.setAttribute("name", "ether-lines");
    this._lineLayer.style.display = "none";
    var C = this._band.getMinDate();
    var A = this._band.getMaxDate();
    var I = this._band.getTimeZone();
    var L = this._band.getLabeller();
    var B = this;
    var J = function(N, M)
    {
        for (var O = 0;
             O < M.multiple;
             O++)
        {
            SimileAjax.DateTime.incrementByInterval(N, M.unit);
        }
    };
    var D = 0;
    while (D < this._zones.length)
    {
        if (C.getTime() < this._zones[D].endTime)
        {
            break;
        }
        D++;
    }
    var E = this._zones.length - 1;
    while (E >= 0)
    {
        if (A.getTime() > this._zones[E].startTime)
        {
            break;
        }
        E--;
    }
    for (var H = D;
         H <= E;
         H++)
    {
        var G = this._zones[H];
        var K = new Date(Math.max(C.getTime(), G.startTime));
        var F = new Date(Math.min(A.getTime(), G.endTime));
        SimileAjax.DateTime.roundDownToInterval(K, G.unit, I, G.multiple, this._theme.firstDayOfWeek);
        SimileAjax.DateTime.roundUpToInterval(F, G.unit, I, G.multiple, this._theme.firstDayOfWeek);
        while (K.getTime() < F.getTime())
        {
            this._intervalMarkerLayout.createIntervalMarker(K, L, G.unit, this._markerLayer, this._lineLayer);
            J(K, G);
        }
    }
    this._markerLayer.style.display = "block";
    this._lineLayer.style.display = "block";
};
Timeline.HotZoneGregorianEtherPainter.prototype.softPaint = function()
{
};
Timeline.HotZoneGregorianEtherPainter.prototype.zoom = function(A)
{
    if (A != 0)
    {
        for (var B = 0;
             B < this._zones.length;
             ++B)
        {
            if (this._zones[B])
            {
                this._zones[B].unit += A;
            }
        }
    }
};
Timeline.YearCountEtherPainter = function(A)
{
    this._params = A;
    this._theme = A.theme;
    this._startDate = SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
    this._multiple = ("multiple" in A) ? A.multiple : 1;
};
Timeline.YearCountEtherPainter.prototype.initialize = function(C, B)
{
    this._band = C;
    this._timeline = B;
    this._backgroundLayer = C.createLayerDiv(0);
    this._backgroundLayer.setAttribute("name", "ether-background");
    this._backgroundLayer.className = "timeline-ether-bg";
    this._markerLayer = null;
    this._lineLayer = null;
    var D = ("align" in this._params) ? this._params.align : this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign" : "vAlign"];
    var A = ("showLine" in this._params) ? this._params.showLine : this._theme.ether.interval.line.show;
    this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(this._timeline, this._band, this._theme, D, A);
    this._highlight = new Timeline.EtherHighlight(this._timeline, this._band, this._theme, this._backgroundLayer);
};
Timeline.YearCountEtherPainter.prototype.setHighlight = function(A, B)
{
    this._highlight.position(A, B);
};
Timeline.YearCountEtherPainter.prototype.paint = function()
{
    if (this._markerLayer)
    {
        this._band.removeLayerDiv(this._markerLayer);
    }
    this._markerLayer = this._band.createLayerDiv(100);
    this._markerLayer.setAttribute("name", "ether-markers");
    this._markerLayer.style.display = "none";
    if (this._lineLayer)
    {
        this._band.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = this._band.createLayerDiv(1);
    this._lineLayer.setAttribute("name", "ether-lines");
    this._lineLayer.style.display = "none";
    var B = new Date(this._startDate.getTime());
    var F = this._band.getMaxDate();
    var E = this._band.getMinDate().getUTCFullYear() - this._startDate.getUTCFullYear();
    B.setUTCFullYear(this._band.getMinDate().getUTCFullYear() - E % this._multiple);
    var C = this;
    var A = function(G)
    {
        for (var H = 0;
             H < C._multiple;
             H++)
        {
            SimileAjax.DateTime.incrementByInterval(G, SimileAjax.DateTime.YEAR);
        }
    };
    var D = {labelInterval:function(G, I)
    {
        var H = G.getUTCFullYear() - C._startDate.getUTCFullYear();
        return{text:H,emphasized:H == 0};
    }};
    while (B.getTime() < F.getTime())
    {
        this._intervalMarkerLayout.createIntervalMarker(B, D, SimileAjax.DateTime.YEAR, this._markerLayer, this._lineLayer);
        A(B);
    }
    this._markerLayer.style.display = "block";
    this._lineLayer.style.display = "block";
};
Timeline.YearCountEtherPainter.prototype.softPaint = function()
{
};
Timeline.QuarterlyEtherPainter = function(A)
{
    this._params = A;
    this._theme = A.theme;
    this._startDate = SimileAjax.DateTime.parseGregorianDateTime(A.startDate);
};
Timeline.QuarterlyEtherPainter.prototype.initialize = function(C, B)
{
    this._band = C;
    this._timeline = B;
    this._backgroundLayer = C.createLayerDiv(0);
    this._backgroundLayer.setAttribute("name", "ether-background");
    this._backgroundLayer.className = "timeline-ether-bg";
    this._markerLayer = null;
    this._lineLayer = null;
    var D = ("align" in this._params) ? this._params.align : this._theme.ether.interval.marker[B.isHorizontal() ? "hAlign" : "vAlign"];
    var A = ("showLine" in this._params) ? this._params.showLine : this._theme.ether.interval.line.show;
    this._intervalMarkerLayout = new Timeline.EtherIntervalMarkerLayout(this._timeline, this._band, this._theme, D, A);
    this._highlight = new Timeline.EtherHighlight(this._timeline, this._band, this._theme, this._backgroundLayer);
};
Timeline.QuarterlyEtherPainter.prototype.setHighlight = function(A, B)
{
    this._highlight.position(A, B);
};
Timeline.QuarterlyEtherPainter.prototype.paint = function()
{
    if (this._markerLayer)
    {
        this._band.removeLayerDiv(this._markerLayer);
    }
    this._markerLayer = this._band.createLayerDiv(100);
    this._markerLayer.setAttribute("name", "ether-markers");
    this._markerLayer.style.display = "none";
    if (this._lineLayer)
    {
        this._band.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = this._band.createLayerDiv(1);
    this._lineLayer.setAttribute("name", "ether-lines");
    this._lineLayer.style.display = "none";
    var B = new Date(0);
    var E = this._band.getMaxDate();
    B.setUTCFullYear(Math.max(this._startDate.getUTCFullYear(), this._band.getMinDate().getUTCFullYear()));
    B.setUTCMonth(this._startDate.getUTCMonth());
    var C = this;
    var A = function(F)
    {
        F.setUTCMonth(F.getUTCMonth() + 3);
    };
    var D = {labelInterval:function(G, H)
    {
        var F = (4 + (G.getUTCMonth() - C._startDate.getUTCMonth()) / 3) % 4;
        if (F != 0)
        {
            return{text:"Q" + (F + 1),emphasized:false};
        }
        else
        {
            return{text:"Y" + (G.getUTCFullYear() - C._startDate.getUTCFullYear() + 1),emphasized:true};
        }
    }};
    while (B.getTime() < E.getTime())
    {
        this._intervalMarkerLayout.createIntervalMarker(B, D, SimileAjax.DateTime.YEAR, this._markerLayer, this._lineLayer);
        A(B);
    }
    this._markerLayer.style.display = "block";
    this._lineLayer.style.display = "block";
};
Timeline.QuarterlyEtherPainter.prototype.softPaint = function()
{
};
Timeline.EtherIntervalMarkerLayout = function(I, L, C, E, M)
{
    var A = I.isHorizontal();
    if (A)
    {
        if (E == "Top")
        {
            this.positionDiv = function(O, N)
            {
                O.style.left = N + "px";
                O.style.top = "0px";
            };
        }
        else
        {
            this.positionDiv = function(O, N)
            {
                O.style.left = N + "px";
                O.style.bottom = "0px";
            };
        }
    }
    else
    {
        if (E == "Left")
        {
            this.positionDiv = function(O, N)
            {
                O.style.top = N + "px";
                O.style.left = "0px";
            };
        }
        else
        {
            this.positionDiv = function(O, N)
            {
                O.style.top = N + "px";
                O.style.right = "0px";
            };
        }
    }
    var D = C.ether.interval.marker;
    var K = C.ether.interval.line;
    var B = C.ether.interval.weekend;
    var H = (A ? "h" : "v") + E;
    var G = D[H + "Styler"];
    var J = D[H + "EmphasizedStyler"];
    var F = SimileAjax.DateTime.gregorianUnitLengths[SimileAjax.DateTime.DAY];
    this.createIntervalMarker = function(T, c, a, Y, P)
    {
        var U = Math.round(L.dateToPixelOffset(T));
        if (M && a != SimileAjax.DateTime.WEEK)
        {
            var V = I.getDocument().createElement("div");
            V.className = "timeline-ether-lines";
            if (K.opacity < 100)
            {
                SimileAjax.Graphics.setOpacity(V, K.opacity);
            }
            if (A)
            {
                V.style.left = U + "px";
            }
            else
            {
                V.style.top = U + "px";
            }
            P.appendChild(V);
        }
        if (a == SimileAjax.DateTime.WEEK)
        {
            var N = C.firstDayOfWeek;
            var R = new Date(T.getTime() + (6 - N - 7) * F);
            var b = new Date(R.getTime() + 2 * F);
            var Q = Math.round(L.dateToPixelOffset(R));
            var S = Math.round(L.dateToPixelOffset(b));
            var W = Math.max(1, S - Q);
            var X = I.getDocument().createElement("div");
            X.className = "timeline-ether-weekends";
            if (B.opacity < 100)
            {
                SimileAjax.Graphics.setOpacity(X, B.opacity);
            }
            if (A)
            {
                X.style.left = Q + "px";
                X.style.width = W + "px";
            }
            else
            {
                X.style.top = Q + "px";
                X.style.height = W + "px";
            }
            P.appendChild(X);
        }
        var Z = c.labelInterval(T, a);
        var O = I.getDocument().createElement("div");
        O.innerHTML = Z.text;
        O.className = "timeline-date-label";
        if (Z.emphasized)
        {
            O.className += " timeline-date-label-em";
        }
        this.positionDiv(O, U);
        Y.appendChild(O);
        return O;
    };
};
Timeline.EtherHighlight = function(B, E, D, C)
{
    var A = B.isHorizontal();
    this._highlightDiv = null;
    this._createHighlightDiv = function()
    {
        if (this._highlightDiv == null)
        {
            this._highlightDiv = B.getDocument().createElement("div");
            this._highlightDiv.setAttribute("name", "ether-highlight");
            this._highlightDiv.className = "timeline-ether-highlight";
            var F = D.ether.highlightOpacity;
            if (F < 100)
            {
                SimileAjax.Graphics.setOpacity(this._highlightDiv, F);
            }
            C.appendChild(this._highlightDiv);
        }
    };
    this.position = function(H, J)
    {
        this._createHighlightDiv();
        var I = Math.round(E.dateToPixelOffset(H));
        var G = Math.round(E.dateToPixelOffset(J));
        var F = Math.max(G - I, 3);
        if (A)
        {
            this._highlightDiv.style.left = I + "px";
            this._highlightDiv.style.width = F + "px";
            this._highlightDiv.style.height = (E.getViewWidth() - 4) + "px";
        }
        else
        {
            this._highlightDiv.style.top = I + "px";
            this._highlightDiv.style.height = F + "px";
            this._highlightDiv.style.width = (E.getViewWidth() - 4) + "px";
        }
    };
};


/* ethers.js */
Timeline.LinearEther = function(A)
{
    this._params = A;
    this._interval = A.interval;
    this._pixelsPerInterval = A.pixelsPerInterval;
};
Timeline.LinearEther.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._unit = A.getUnit();
    if ("startsOn" in this._params)
    {
        this._start = this._unit.parseFromObject(this._params.startsOn);
    }
    else
    {
        if ("endsOn" in this._params)
        {
            this._start = this._unit.parseFromObject(this._params.endsOn);
            this.shiftPixels(-this._timeline.getPixelLength());
        }
        else
        {
            if ("centersOn" in this._params)
            {
                this._start = this._unit.parseFromObject(this._params.centersOn);
                this.shiftPixels(-this._timeline.getPixelLength() / 2);
            }
            else
            {
                this._start = this._unit.makeDefaultValue();
                this.shiftPixels(-this._timeline.getPixelLength() / 2);
            }
        }
    }
};
Timeline.LinearEther.prototype.setDate = function(A)
{
    this._start = this._unit.cloneValue(A);
};
Timeline.LinearEther.prototype.shiftPixels = function(B)
{
    var A = this._interval * B / this._pixelsPerInterval;
    this._start = this._unit.change(this._start, A);
};
Timeline.LinearEther.prototype.dateToPixelOffset = function(B)
{
    var A = this._unit.compare(B, this._start);
    return this._pixelsPerInterval * A / this._interval;
};
Timeline.LinearEther.prototype.pixelOffsetToDate = function(B)
{
    var A = B * this._interval / this._pixelsPerInterval;
    return this._unit.change(this._start, A);
};
Timeline.LinearEther.prototype.zoom = function(D)
{
    var A = 0;
    var B = this._band._zoomIndex;
    var C = B;
    if (D && (B > 0))
    {
        C = B - 1;
    }
    if (!D && (B < (this._band._zoomSteps.length - 1)))
    {
        C = B + 1;
    }
    this._band._zoomIndex = C;
    this._interval = SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
    this._pixelsPerInterval = this._band._zoomSteps[C].pixelsPerInterval;
    A = this._band._zoomSteps[C].unit - this._band._zoomSteps[B].unit;
    return A;
};
Timeline.HotZoneEther = function(A)
{
    this._params = A;
    this._interval = A.interval;
    this._pixelsPerInterval = A.pixelsPerInterval;
    this._theme = A.theme;
};
Timeline.HotZoneEther.prototype.initialize = function(I, H)
{
    this._band = I;
    this._timeline = H;
    this._unit = H.getUnit();
    this._zones = [
        {startTime:Number.NEGATIVE_INFINITY,endTime:Number.POSITIVE_INFINITY,magnify:1}
    ];
    var D = this._params;
    for (var E = 0;
         E < D.zones.length;
         E++)
    {
        var G = D.zones[E];
        var F = this._unit.parseFromObject(G.start);
        var B = this._unit.parseFromObject(G.end);
        for (var C = 0;
             C < this._zones.length && this._unit.compare(B, F) > 0;
             C++)
        {
            var A = this._zones[C];
            if (this._unit.compare(F, A.endTime) < 0)
            {
                if (this._unit.compare(F, A.startTime) > 0)
                {
                    this._zones.splice(C, 0, {startTime:A.startTime,endTime:F,magnify:A.magnify});
                    C++;
                    A.startTime = F;
                }
                if (this._unit.compare(B, A.endTime) < 0)
                {
                    this._zones.splice(C, 0, {startTime:F,endTime:B,magnify:G.magnify * A.magnify});
                    C++;
                    A.startTime = B;
                    F = B;
                }
                else
                {
                    A.magnify *= G.magnify;
                    F = A.endTime;
                }
            }
        }
    }
    if ("startsOn" in this._params)
    {
        this._start = this._unit.parseFromObject(this._params.startsOn);
    }
    else
    {
        if ("endsOn" in this._params)
        {
            this._start = this._unit.parseFromObject(this._params.endsOn);
            this.shiftPixels(-this._timeline.getPixelLength());
        }
        else
        {
            if ("centersOn" in this._params)
            {
                this._start = this._unit.parseFromObject(this._params.centersOn);
                this.shiftPixels(-this._timeline.getPixelLength() / 2);
            }
            else
            {
                this._start = this._unit.makeDefaultValue();
                this.shiftPixels(-this._timeline.getPixelLength() / 2);
            }
        }
    }
};
Timeline.HotZoneEther.prototype.setDate = function(A)
{
    this._start = this._unit.cloneValue(A);
};
Timeline.HotZoneEther.prototype.shiftPixels = function(A)
{
    this._start = this.pixelOffsetToDate(A);
};
Timeline.HotZoneEther.prototype.dateToPixelOffset = function(A)
{
    return this._dateDiffToPixelOffset(this._start, A);
};
Timeline.HotZoneEther.prototype.pixelOffsetToDate = function(A)
{
    return this._pixelOffsetToDate(A, this._start);
};
Timeline.HotZoneEther.prototype.zoom = function(D)
{
    var A = 0;
    var B = this._band._zoomIndex;
    var C = B;
    if (D && (B > 0))
    {
        C = B - 1;
    }
    if (!D && (B < (this._band._zoomSteps.length - 1)))
    {
        C = B + 1;
    }
    this._band._zoomIndex = C;
    this._interval = SimileAjax.DateTime.gregorianUnitLengths[this._band._zoomSteps[C].unit];
    this._pixelsPerInterval = this._band._zoomSteps[C].pixelsPerInterval;
    A = this._band._zoomSteps[C].unit - this._band._zoomSteps[B].unit;
    return A;
};
Timeline.HotZoneEther.prototype._dateDiffToPixelOffset = function(H, C)
{
    var D = this._getScale();
    var I = H;
    var B = C;
    var E = 0;
    if (this._unit.compare(I, B) < 0)
    {
        var G = 0;
        while (G < this._zones.length)
        {
            if (this._unit.compare(I, this._zones[G].endTime) < 0)
            {
                break;
            }
            G++;
        }
        while (this._unit.compare(I, B) < 0)
        {
            var F = this._zones[G];
            var A = this._unit.earlier(B, F.endTime);
            E += (this._unit.compare(A, I) / (D / F.magnify));
            I = A;
            G++;
        }
    }
    else
    {
        var G = this._zones.length - 1;
        while (G >= 0)
        {
            if (this._unit.compare(I, this._zones[G].startTime) > 0)
            {
                break;
            }
            G--;
        }
        while (this._unit.compare(I, B) > 0)
        {
            var F = this._zones[G];
            var A = this._unit.later(B, F.startTime);
            E += (this._unit.compare(A, I) / (D / F.magnify));
            I = A;
            G--;
        }
    }
    return E;
};
Timeline.HotZoneEther.prototype._pixelOffsetToDate = function(E, B)
{
    var G = this._getScale();
    var D = B;
    if (E > 0)
    {
        var F = 0;
        while (F < this._zones.length)
        {
            if (this._unit.compare(D, this._zones[F].endTime) < 0)
            {
                break;
            }
            F++;
        }
        while (E > 0)
        {
            var A = this._zones[F];
            var H = G / A.magnify;
            if (A.endTime == Number.POSITIVE_INFINITY)
            {
                D = this._unit.change(D, E * H);
                E = 0;
            }
            else
            {
                var C = this._unit.compare(A.endTime, D) / H;
                if (C > E)
                {
                    D = this._unit.change(D, E * H);
                    E = 0;
                }
                else
                {
                    D = A.endTime;
                    E -= C;
                }
            }
            F++;
        }
    }
    else
    {
        var F = this._zones.length - 1;
        while (F >= 0)
        {
            if (this._unit.compare(D, this._zones[F].startTime) > 0)
            {
                break;
            }
            F--;
        }
        E = -E;
        while (E > 0)
        {
            var A = this._zones[F];
            var H = G / A.magnify;
            if (A.startTime == Number.NEGATIVE_INFINITY)
            {
                D = this._unit.change(D, -E * H);
                E = 0;
            }
            else
            {
                var C = this._unit.compare(D, A.startTime) / H;
                if (C > E)
                {
                    D = this._unit.change(D, -E * H);
                    E = 0;
                }
                else
                {
                    D = A.startTime;
                    E -= C;
                }
            }
            F--;
        }
    }
    return D;
};
Timeline.HotZoneEther.prototype._getScale = function()
{
    return this._interval / this._pixelsPerInterval;
};


/* event-utils.js */
Timeline.EventUtils = {};
Timeline.EventUtils.getNewEventID = function()
{
    if (this._lastEventID == null)
    {
        this._lastEventID = 0;
    }
    this._lastEventID += 1;
    return"e" + this._lastEventID;
};
Timeline.EventUtils.decodeEventElID = function(C)
{
    var D = C.split("-");
    if (D[1] != "tl")
    {
        alert("Internal Timeline problem 101, please consult support");
        return{band:null,evt:null};
    }
    var B = Timeline.getTimelineFromID(D[2]);
    var E = B.getBand(D[3]);
    var A = E.getEventSource.getEvent(D[4]);
    return{band:E,evt:A};
};
Timeline.EventUtils.encodeEventElID = function(B, D, C, A)
{
    return C + "-tl-" + B.timelineID + "-" + D.getIndex() + "-" + A.getID();
};


/* labellers.js */
Timeline.GregorianDateLabeller = function(B, A)
{
    this._locale = B;
    this._timeZone = A;
};
Timeline.GregorianDateLabeller.monthNames = [];
Timeline.GregorianDateLabeller.dayNames = [];
Timeline.GregorianDateLabeller.labelIntervalFunctions = [];
Timeline.GregorianDateLabeller.getMonthName = function(B, A)
{
    return Timeline.GregorianDateLabeller.monthNames[A][B];
};
Timeline.GregorianDateLabeller.prototype.labelInterval = function(A, C)
{
    var B = Timeline.GregorianDateLabeller.labelIntervalFunctions[this._locale];
    if (B == null)
    {
        B = Timeline.GregorianDateLabeller.prototype.defaultLabelInterval;
    }
    return B.call(this, A, C);
};
Timeline.GregorianDateLabeller.prototype.labelPrecise = function(A)
{
    return SimileAjax.DateTime.removeTimeZoneOffset(A, this._timeZone).toUTCString();
};
Timeline.GregorianDateLabeller.prototype.defaultLabelInterval = function(B, C)
{
    var D;
    var F = false;
    B = SimileAjax.DateTime.removeTimeZoneOffset(B, this._timeZone);
    switch (C)
    {case SimileAjax.DateTime.MILLISECOND:D = B.getUTCMilliseconds();
        break;
        case SimileAjax.DateTime.SECOND:D = B.getUTCSeconds();
            break;
        case SimileAjax.DateTime.MINUTE:var A = B.getUTCMinutes();
            if (A == 0)
            {
                D = B.getUTCHours() + ":00";
                F = true;
            }
            else
            {
                D = A;
            }break;
        case SimileAjax.DateTime.HOUR:D = B.getUTCHours() + "hr";
            break;
        case SimileAjax.DateTime.DAY:D = Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(), this._locale) + " " + B.getUTCDate();
            break;
        case SimileAjax.DateTime.WEEK:D = Timeline.GregorianDateLabeller.getMonthName(B.getUTCMonth(), this._locale) + " " + B.getUTCDate();
            break;
        case SimileAjax.DateTime.MONTH:var A = B.getUTCMonth();
            if (A != 0)
            {
                D = Timeline.GregorianDateLabeller.getMonthName(A, this._locale);
                break;
            }case SimileAjax.DateTime.YEAR:case SimileAjax.DateTime.DECADE:case SimileAjax.DateTime.CENTURY:case SimileAjax.DateTime.MILLENNIUM:var E = B.getUTCFullYear();
        if (E > 0)
        {
            D = B.getUTCFullYear();
        }
        else
        {
            D = (1 - E) + "BC";
        }F = (C == SimileAjax.DateTime.MONTH) || (C == SimileAjax.DateTime.DECADE && E % 100 == 0) || (C == SimileAjax.DateTime.CENTURY && E % 1000 == 0);
        break;
        default:D = B.toUTCString();
    }
    return{text:D,emphasized:F};
};


/* original-painter.js */
Timeline.OriginalEventPainter = function(A)
{
    this._params = A;
    this._onSelectListeners = [];
    this._eventPaintListeners = [];
    this._filterMatcher = null;
    this._highlightMatcher = null;
    this._frc = null;
    this._eventIdToElmt = {};
};
Timeline.OriginalEventPainter.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._backLayer = null;
    this._eventLayer = null;
    this._lineLayer = null;
    this._highlightLayer = null;
    this._eventIdToElmt = null;
};
Timeline.OriginalEventPainter.prototype.getType = function()
{
    return"original";
};
Timeline.OriginalEventPainter.prototype.addOnSelectListener = function(A)
{
    this._onSelectListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeOnSelectListener = function(B)
{
    for (var A = 0;
         A < this._onSelectListeners.length;
         A++)
    {
        if (this._onSelectListeners[A] == B)
        {
            this._onSelectListeners.splice(A, 1);
            break;
        }
    }
};
Timeline.OriginalEventPainter.prototype.addEventPaintListener = function(A)
{
    this._eventPaintListeners.push(A);
};
Timeline.OriginalEventPainter.prototype.removeEventPaintListener = function(B)
{
    for (var A = 0;
         A < this._eventPaintListeners.length;
         A++)
    {
        if (this._eventPaintListeners[A] == B)
        {
            this._eventPaintListeners.splice(A, 1);
            break;
        }
    }
};
Timeline.OriginalEventPainter.prototype.getFilterMatcher = function()
{
    return this._filterMatcher;
};
Timeline.OriginalEventPainter.prototype.setFilterMatcher = function(A)
{
    this._filterMatcher = A;
};
Timeline.OriginalEventPainter.prototype.getHighlightMatcher = function()
{
    return this._highlightMatcher;
};
Timeline.OriginalEventPainter.prototype.setHighlightMatcher = function(A)
{
    this._highlightMatcher = A;
};
Timeline.OriginalEventPainter.prototype.paint = function()
{
    var C = this._band.getEventSource();
    if (C == null)
    {
        return;
    }
    this._eventIdToElmt = {};
    this._fireEventPaintListeners("paintStarting", null, null);
    this._prepareForPainting();
    var I = this._params.theme.event;
    var G = Math.max(I.track.height, I.tape.height + this._frc.getLineHeight());
    var F = {trackOffset:I.track.offset,trackHeight:G,trackGap:I.track.gap,trackIncrement:G + I.track.gap,icon:I.instant.icon,iconWidth:I.instant.iconWidth,iconHeight:I.instant.iconHeight,labelWidth:I.label.width,maxLabelChar:I.label.maxLabelChar,impreciseIconMargin:I.instant.impreciseIconMargin};
    var D = this._band.getMinDate();
    var B = this._band.getMaxDate();
    var J = (this._filterMatcher != null) ? this._filterMatcher : function(K)
    {
        return true;
    };
    var A = (this._highlightMatcher != null) ? this._highlightMatcher : function(K)
    {
        return -1;
    };
    var E = C.getEventReverseIterator(D, B);
    while (E.hasNext())
    {
        var H = E.next();
        if (J(H))
        {
            this.paintEvent(H, F, this._params.theme, A(H));
        }
    }
    this._highlightLayer.style.display = "block";
    this._lineLayer.style.display = "block";
    this._eventLayer.style.display = "block";
    this._band.updateEventTrackInfo(this._tracks.length, F.trackIncrement);
    this._fireEventPaintListeners("paintEnded", null, null);
};
Timeline.OriginalEventPainter.prototype.softPaint = function()
{
};
Timeline.OriginalEventPainter.prototype._prepareForPainting = function()
{
    var B = this._band;
    if (this._backLayer == null)
    {
        this._backLayer = this._band.createLayerDiv(0, "timeline-band-events");
        this._backLayer.style.visibility = "hidden";
        var A = document.createElement("span");
        A.className = "timeline-event-label";
        this._backLayer.appendChild(A);
        this._frc = SimileAjax.Graphics.getFontRenderingContext(A);
    }
    this._frc.update();
    this._tracks = [];
    if (this._highlightLayer != null)
    {
        B.removeLayerDiv(this._highlightLayer);
    }
    this._highlightLayer = B.createLayerDiv(105, "timeline-band-highlights");
    this._highlightLayer.style.display = "none";
    if (this._lineLayer != null)
    {
        B.removeLayerDiv(this._lineLayer);
    }
    this._lineLayer = B.createLayerDiv(110, "timeline-band-lines");
    this._lineLayer.style.display = "none";
    if (this._eventLayer != null)
    {
        B.removeLayerDiv(this._eventLayer);
    }
    this._eventLayer = B.createLayerDiv(115, "timeline-band-events");
    this._eventLayer.style.display = "none";
};
Timeline.OriginalEventPainter.prototype.paintEvent = function(B, C, D, A)
{
    if (B.isInstant())
    {
        this.paintInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintDurationEvent(B, C, D, A);
    }
};
Timeline.OriginalEventPainter.prototype.paintInstantEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseInstantEvent(B, C, D, A);
    }
};
Timeline.OriginalEventPainter.prototype.paintDurationEvent = function(B, C, D, A)
{
    if (B.isImprecise())
    {
        this.paintImpreciseDurationEvent(B, C, D, A);
    }
    else
    {
        this.paintPreciseDurationEvent(B, C, D, A);
    }
};
Timeline.OriginalEventPainter.prototype.paintPreciseInstantEvent = function(N, S, V, T)
{
    var W = this._timeline.getDocument();
    var L = N.getText();
    var H = N.getStart();
    var I = Math.round(this._band.dateToPixelOffset(H));
    var A = Math.round(I + S.iconWidth / 2);
    var C = Math.round(I - S.iconWidth / 2);
    var F = this._getLabelDivClassName(N);
    var D = this._frc.computeSize(L, F);
    var M = A + V.event.label.offsetFromLine;
    var J = M + D.width;
    var Q = J;
    var P = this._findFreeTrack(N, Q);
    var R = Math.round(S.trackOffset + P * S.trackIncrement + S.trackHeight / 2 - D.height / 2);
    var B = this._paintEventIcon(N, P, C, S, V, 0);
    var U = this._paintEventLabel(N, L, M, R, D.width, D.height, V, F, T);
    var E = [B.elmt,U.elmt];
    var O = this;
    var K = function(Y, X, Z)
    {
        return O._onClickInstantEvent(B.elmt, X, N);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", K);
    SimileAjax.DOM.registerEvent(U.elmt, "mousedown", K);
    var G = this._createHighlightDiv(T, B, V, N);
    if (G != null)
    {
        E.push(G);
    }
    this._fireEventPaintListeners("paintedEvent", N, E);
    this._eventIdToElmt[N.getID()] = B.elmt;
    this._tracks[P] = C;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseInstantEvent = function(P, U, Z, W)
{
    var b = this._timeline.getDocument();
    var N = P.getText();
    var J = P.getStart();
    var X = P.getEnd();
    var K = Math.round(this._band.dateToPixelOffset(J));
    var B = Math.round(this._band.dateToPixelOffset(X));
    var A = Math.round(K + U.iconWidth / 2);
    var D = Math.round(K - U.iconWidth / 2);
    var H = this._getLabelDivClassName(P);
    var F = this._frc.computeSize(N, H);
    var O = A + Z.event.label.offsetFromLine;
    var L = O + F.width;
    var S = Math.max(L, B);
    var R = this._findFreeTrack(P, S);
    var a = Z.event.tape.height;
    var T = Math.round(U.trackOffset + R * U.trackIncrement + a);
    var C = this._paintEventIcon(P, R, D, U, Z, a);
    var Y = this._paintEventLabel(P, N, O, T, F.width, F.height, Z, H, W);
    var V = P.getColor();
    V = V != null ? V : Z.event.instant.impreciseColor;
    var E = this._paintEventTape(P, R, K, B, V, Z.event.instant.impreciseOpacity, U, Z, 0);
    var G = [C.elmt,Y.elmt,E.elmt];
    var Q = this;
    var M = function(d, c, e)
    {
        return Q._onClickInstantEvent(C.elmt, c, P);
    };
    SimileAjax.DOM.registerEvent(C.elmt, "mousedown", M);
    SimileAjax.DOM.registerEvent(E.elmt, "mousedown", M);
    SimileAjax.DOM.registerEvent(Y.elmt, "mousedown", M);
    var I = this._createHighlightDiv(W, C, Z, P);
    if (I != null)
    {
        G.push(I);
    }
    this._fireEventPaintListeners("paintedEvent", P, G);
    this._eventIdToElmt[P.getID()] = C.elmt;
    this._tracks[R] = D;
};
Timeline.OriginalEventPainter.prototype.paintPreciseDurationEvent = function(M, R, W, T)
{
    var X = this._timeline.getDocument();
    var K = M.getText();
    var G = M.getStart();
    var U = M.getEnd();
    var H = Math.round(this._band.dateToPixelOffset(G));
    var A = Math.round(this._band.dateToPixelOffset(U));
    var E = this._getLabelDivClassName(M);
    var C = this._frc.computeSize(K, E);
    var L = H;
    var I = L + C.width;
    var P = Math.max(I, A);
    var O = this._findFreeTrack(M, P);
    var Q = Math.round(R.trackOffset + O * R.trackIncrement + W.event.tape.height);
    var S = M.getColor();
    S = S != null ? S : W.event.duration.color;
    var B = this._paintEventTape(M, O, H, A, S, 100, R, W, 0);
    var V = this._paintEventLabel(M, K, L, Q, C.width, C.height, W, E, T);
    var D = [B.elmt,V.elmt];
    var N = this;
    var J = function(Z, Y, a)
    {
        return N._onClickDurationEvent(B.elmt, Y, M);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", J);
    SimileAjax.DOM.registerEvent(V.elmt, "mousedown", J);
    var F = this._createHighlightDiv(T, B, W, M);
    if (F != null)
    {
        D.push(F);
    }
    this._fireEventPaintListeners("paintedEvent", M, D);
    this._eventIdToElmt[M.getID()] = B.elmt;
    this._tracks[O] = H;
};
Timeline.OriginalEventPainter.prototype.paintImpreciseDurationEvent = function(O, W, b, Y)
{
    var c = this._timeline.getDocument();
    var M = O.getText();
    var I = O.getStart();
    var V = O.getLatestStart();
    var Z = O.getEnd();
    var Q = O.getEarliestEnd();
    var K = Math.round(this._band.dateToPixelOffset(I));
    var F = Math.round(this._band.dateToPixelOffset(V));
    var A = Math.round(this._band.dateToPixelOffset(Z));
    var G = Math.round(this._band.dateToPixelOffset(Q));
    var E = this._getLabelDivClassName(O);
    var C = this._frc.computeSize(M, E);
    var N = F;
    var J = N + C.width;
    var S = Math.max(J, A);
    var R = this._findFreeTrack(O, S);
    var T = Math.round(W.trackOffset + R * W.trackIncrement + b.event.tape.height);
    var X = O.getColor();
    X = X != null ? X : b.event.duration.color;
    var U = this._paintEventTape(O, R, K, A, b.event.duration.impreciseColor, b.event.duration.impreciseOpacity, W, b, 0);
    var B = this._paintEventTape(O, R, F, G, X, 100, W, b, 1);
    var a = this._paintEventLabel(O, M, N, T, C.width, C.height, b, E, Y);
    var D = [U.elmt,B.elmt,a.elmt];
    var P = this;
    var L = function(e, d, f)
    {
        return P._onClickDurationEvent(B.elmt, d, O);
    };
    SimileAjax.DOM.registerEvent(B.elmt, "mousedown", L);
    SimileAjax.DOM.registerEvent(a.elmt, "mousedown", L);
    var H = this._createHighlightDiv(Y, B, b, O);
    if (H != null)
    {
        D.push(H);
    }
    this._fireEventPaintListeners("paintedEvent", O, D);
    this._eventIdToElmt[O.getID()] = B.elmt;
    this._tracks[R] = K;
};
Timeline.OriginalEventPainter.prototype._encodeEventElID = function(B, A)
{
    return Timeline.EventUtils.encodeEventElID(this._timeline, this._band, B, A);
};
Timeline.OriginalEventPainter.prototype._findFreeTrack = function(E, D)
{
    var A = E.getTrackNum();
    if (A != null)
    {
        return A;
    }
    for (var C = 0;
         C < this._tracks.length;
         C++)
    {
        var B = this._tracks[C];
        if (B > D)
        {
            break;
        }
    }
    return C;
};
Timeline.OriginalEventPainter.prototype._paintEventIcon = function(K, B, C, G, F, D)
{
    var I = K.getIcon();
    I = I != null ? I : G.icon;
    var J;
    if (D > 0)
    {
        J = G.trackOffset + B * G.trackIncrement + D + G.impreciseIconMargin;
    }
    else
    {
        var H = G.trackOffset + B * G.trackIncrement + G.trackHeight / 2;
        J = Math.round(H - G.iconHeight / 2);
    }
    var E = SimileAjax.Graphics.createTranslucentImage(I);
    var A = this._timeline.getDocument().createElement("div");
    A.className = this._getElClassName("timeline-event-icon", K, "icon");
    A.id = this._encodeEventElID("icon", K);
    A.style.left = C + "px";
    A.style.top = J + "px";
    A.appendChild(E);
    if (K._title != null)
    {
        A.title = K._title;
    }
    this._eventLayer.appendChild(A);
    return{left:C,top:J,width:G.iconWidth,height:G.iconHeight,elmt:A};
};
Timeline.OriginalEventPainter.prototype._paintEventLabel = function(K, L, D, H, A, J, G, E, C)
{
    var I = this._timeline.getDocument();
    var B = I.createElement("div");
    B.className = E;
    B.id = this._encodeEventElID("label", K);
    B.style.left = D + "px";
    B.style.width = A + "px";
    B.style.top = H + "px";
    B.innerHTML = L;
    if (K._title != null)
    {
        B.title = K._title;
    }
    var F = K.getTextColor();
    if (F == null)
    {
        F = K.getColor();
    }
    if (F != null)
    {
        B.style.color = F;
    }
    if (G.event.highlightLabelBackground && C >= 0)
    {
        B.style.background = this._getHighlightColor(C, G);
    }
    this._eventLayer.appendChild(B);
    return{left:D,top:H,width:A,height:J,elmt:B};
};
Timeline.OriginalEventPainter.prototype._paintEventTape = function(N, B, D, A, G, C, J, I, M)
{
    var F = A - D;
    var E = I.event.tape.height;
    var K = J.trackOffset + B * J.trackIncrement;
    var O = this._timeline.getDocument().createElement("div");
    O.className = this._getElClassName("timeline-event-tape", N, "tape");
    O.id = this._encodeEventElID("tape" + M, N);
    O.style.left = D + "px";
    O.style.width = F + "px";
    O.style.height = E + "px";
    O.style.top = K + "px";
    if (N._title != null)
    {
        O.title = N._title;
    }
    if (G != null)
    {
        O.style.backgroundColor = G;
    }
    var L = N.getTapeImage();
    var H = N.getTapeRepeat();
    H = H != null ? H : "repeat";
    if (L != null)
    {
        O.style.backgroundImage = "url(" + L + ")";
        O.style.backgroundRepeat = H;
    }
    SimileAjax.Graphics.setOpacity(O, C);
    this._eventLayer.appendChild(O);
    return{left:D,top:K,width:F,height:E,elmt:O};
};
Timeline.OriginalEventPainter.prototype._getLabelDivClassName = function(A)
{
    return this._getElClassName("timeline-event-label", A, "label");
};
Timeline.OriginalEventPainter.prototype._getElClassName = function(D, C, A)
{
    var E = C.getClassName(),B = [];
    if (E)
    {
        if (A)
        {
            B.push(A + "-" + E + " ");
        }
        B.push(E + " ");
    }
    B.push(D);
    return(B.join(""));
};
Timeline.OriginalEventPainter.prototype._getHighlightColor = function(A, B)
{
    var C = B.event.highlightColors;
    return C[Math.min(A, C.length - 1)];
};
Timeline.OriginalEventPainter.prototype._createHighlightDiv = function(A, D, F, B)
{
    var G = null;
    if (A >= 0)
    {
        var E = this._timeline.getDocument();
        var C = this._getHighlightColor(A, F);
        G = E.createElement("div");
        G.className = this._getElClassName("timeline-event-highlight", B, "highlight");
        G.id = this._encodeEventElID("highlight0", B);
        G.style.position = "absolute";
        G.style.overflow = "hidden";
        G.style.left = (D.left - 2) + "px";
        G.style.width = (D.width + 4) + "px";
        G.style.top = (D.top - 2) + "px";
        G.style.height = (D.height + 4) + "px";
        G.style.background = C;
        this._highlightLayer.appendChild(G);
    }
    return G;
};
Timeline.OriginalEventPainter.prototype._onClickInstantEvent = function(C, A, B)
{
    var D = SimileAjax.DOM.getPageCoordinates(C);
    this._showBubble(D.left + Math.ceil(C.offsetWidth / 2), D.top + Math.ceil(C.offsetHeight / 2), B);
    this._fireOnSelect(B.getID());
    A.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(A);
    return false;
};
Timeline.OriginalEventPainter.prototype._onClickDurationEvent = function(F, B, C)
{
    if ("pageX" in B)
    {
        var A = B.pageX;
        var E = B.pageY;
    }
    else
    {
        var D = SimileAjax.DOM.getPageCoordinates(F);
        var A = B.offsetX + D.left;
        var E = B.offsetY + D.top;
    }
    this._showBubble(A, E, C);
    this._fireOnSelect(C.getID());
    B.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(B);
    return false;
};
Timeline.OriginalEventPainter.prototype.showBubble = function(A)
{
    var B = this._eventIdToElmt[A.getID()];
    if (B)
    {
        var C = SimileAjax.DOM.getPageCoordinates(B);
        this._showBubble(C.left + B.offsetWidth / 2, C.top + B.offsetHeight / 2, A);
    }
};
Timeline.OriginalEventPainter.prototype._showBubble = function(B, E, C)
{
    var D = document.createElement("div");
    var A = this._params.theme.event.bubble;
    C.fillInfoBubble(D, this._params.theme, this._band.getLabeller());
    SimileAjax.WindowManager.cancelPopups();
    SimileAjax.Graphics.createBubbleForContentAndPoint(D, B, E, A.width, null, A.maxHeight);
};
Timeline.OriginalEventPainter.prototype._fireOnSelect = function(A)
{
    for (var B = 0;
         B < this._onSelectListeners.length;
         B++)
    {
        this._onSelectListeners[B](A);
    }
};
Timeline.OriginalEventPainter.prototype._fireEventPaintListeners = function(D, A, C)
{
    for (var B = 0;
         B < this._eventPaintListeners.length;
         B++)
    {
        this._eventPaintListeners[B](this._band, D, A, C);
    }
};


/* overview-painter.js */
Timeline.OverviewEventPainter = function(A)
{
    this._params = A;
    this._onSelectListeners = [];
    this._filterMatcher = null;
    this._highlightMatcher = null;
};
Timeline.OverviewEventPainter.prototype.initialize = function(B, A)
{
    this._band = B;
    this._timeline = A;
    this._eventLayer = null;
    this._highlightLayer = null;
};
Timeline.OverviewEventPainter.prototype.getType = function()
{
    return"overview";
};
Timeline.OverviewEventPainter.prototype.addOnSelectListener = function(A)
{
    this._onSelectListeners.push(A);
};
Timeline.OverviewEventPainter.prototype.removeOnSelectListener = function(B)
{
    for (var A = 0;
         A < this._onSelectListeners.length;
         A++)
    {
        if (this._onSelectListeners[A] == B)
        {
            this._onSelectListeners.splice(A, 1);
            break;
        }
    }
};
Timeline.OverviewEventPainter.prototype.getFilterMatcher = function()
{
    return this._filterMatcher;
};
Timeline.OverviewEventPainter.prototype.setFilterMatcher = function(A)
{
    this._filterMatcher = A;
};
Timeline.OverviewEventPainter.prototype.getHighlightMatcher = function()
{
    return this._highlightMatcher;
};
Timeline.OverviewEventPainter.prototype.setHighlightMatcher = function(A)
{
    this._highlightMatcher = A;
};
Timeline.OverviewEventPainter.prototype.paint = function()
{
    var C = this._band.getEventSource();
    if (C == null)
    {
        return;
    }
    this._prepareForPainting();
    var H = this._params.theme.event;
    var F = {trackOffset:H.overviewTrack.offset,trackHeight:H.overviewTrack.height,trackGap:H.overviewTrack.gap,trackIncrement:H.overviewTrack.height + H.overviewTrack.gap};
    var D = this._band.getMinDate();
    var B = this._band.getMaxDate();
    var I = (this._filterMatcher != null) ? this._filterMatcher : function(J)
    {
        return true;
    };
    var A = (this._highlightMatcher != null) ? this._highlightMatcher : function(J)
    {
        return -1;
    };
    var E = C.getEventReverseIterator(D, B);
    while (E.hasNext())
    {
        var G = E.next();
        if (I(G))
        {
            this.paintEvent(G, F, this._params.theme, A(G));
        }
    }
    this._highlightLayer.style.display = "block";
    this._eventLayer.style.display = "block";
    this._band.updateEventTrackInfo(this._tracks.length, F.trackIncrement);
};
Timeline.OverviewEventPainter.prototype.softPaint = function()
{
};
Timeline.OverviewEventPainter.prototype._prepareForPainting = function()
{
    var A = this._band;
    this._tracks = [];
    if (this._highlightLayer != null)
    {
        A.removeLayerDiv(this._highlightLayer);
    }
    this._highlightLayer = A.createLayerDiv(105, "timeline-band-highlights");
    this._highlightLayer.style.display = "none";
    if (this._eventLayer != null)
    {
        A.removeLayerDiv(this._eventLayer);
    }
    this._eventLayer = A.createLayerDiv(110, "timeline-band-events");
    this._eventLayer.style.display = "none";
};
Timeline.OverviewEventPainter.prototype.paintEvent = function(B, C, D, A)
{
    if (B.isInstant())
    {
        this.paintInstantEvent(B, C, D, A);
    }
    else
    {
        this.paintDurationEvent(B, C, D, A);
    }
};
Timeline.OverviewEventPainter.prototype.paintInstantEvent = function(I, H, E, A)
{
    var F = I.getStart();
    var B = Math.round(this._band.dateToPixelOffset(F));
    var C = I.getColor(),D = I.getClassName();
    if (D)
    {
        C = null;
    }
    else
    {
        C = C != null ? C : E.event.duration.color;
    }
    var G = this._paintEventTick(I, B, C, 100, H, E);
    this._createHighlightDiv(A, G, E);
};
Timeline.OverviewEventPainter.prototype.paintDurationEvent = function(L, K, H, B)
{
    var A = L.getLatestStart();
    var I = L.getEarliestEnd();
    var J = Math.round(this._band.dateToPixelOffset(A));
    var C = Math.round(this._band.dateToPixelOffset(I));
    var F = 0;
    for (;
            F < this._tracks.length;
            F++)
    {
        if (C < this._tracks[F])
        {
            break;
        }
    }
    this._tracks[F] = C;
    var E = L.getColor(),G = L.getClassName();
    if (G)
    {
        E = null;
    }
    else
    {
        E = E != null ? E : H.event.duration.color;
    }
    var D = this._paintEventTape(L, F, J, C, E, 100, K, H, G);
    this._createHighlightDiv(B, D, H);
};
Timeline.OverviewEventPainter.prototype._paintEventTape = function(K, B, D, L, E, C, H, G, F)
{
    var I = H.trackOffset + B * H.trackIncrement;
    var A = L - D;
    var J = H.trackHeight;
    var M = this._timeline.getDocument().createElement("div");
    M.className = "timeline-small-event-tape";
    if (F)
    {
        M.className += " small-" + F;
    }
    M.style.left = D + "px";
    M.style.width = A + "px";
    M.style.top = I + "px";
    M.style.height = J + "px";
    if (E)
    {
        M.style.backgroundColor = E;
    }
    if (C < 100)
    {
        SimileAjax.Graphics.setOpacity(M, C);
    }
    this._eventLayer.appendChild(M);
    return{left:D,top:I,width:A,height:J,elmt:M};
};
Timeline.OverviewEventPainter.prototype._paintEventTick = function(J, C, D, B, G, F)
{
    var I = F.event.overviewTrack.tickHeight;
    var H = G.trackOffset - I;
    var A = 1;
    var K = this._timeline.getDocument().createElement("div");
    K.className = "timeline-small-event-icon";
    K.style.left = C + "px";
    K.style.top = H + "px";
    var E = J.getClassName();
    if (E)
    {
        K.className += " small-" + E;
    }
    if (B < 100)
    {
        SimileAjax.Graphics.setOpacity(K, B);
    }
    this._eventLayer.appendChild(K);
    return{left:C,top:H,width:A,height:I,elmt:K};
};
Timeline.OverviewEventPainter.prototype._createHighlightDiv = function(A, C, E)
{
    if (A >= 0)
    {
        var D = this._timeline.getDocument();
        var G = E.event;
        var B = G.highlightColors[Math.min(A, G.highlightColors.length - 1)];
        var F = D.createElement("div");
        F.style.position = "absolute";
        F.style.overflow = "hidden";
        F.style.left = (C.left - 1) + "px";
        F.style.width = (C.width + 2) + "px";
        F.style.top = (C.top - 1) + "px";
        F.style.height = (C.height + 2) + "px";
        F.style.background = B;
        this._highlightLayer.appendChild(F);
    }
};
Timeline.OverviewEventPainter.prototype.showBubble = function(A)
{
};


/* sources.js */
Timeline.DefaultEventSource = function(A)
{
    this._events = (A instanceof Object) ? A : new SimileAjax.EventIndex();
    this._listeners = [];
};
Timeline.DefaultEventSource.prototype.addListener = function(A)
{
    this._listeners.push(A);
};
Timeline.DefaultEventSource.prototype.removeListener = function(B)
{
    for (var A = 0;
         A < this._listeners.length;
         A++)
    {
        if (this._listeners[A] == B)
        {
            this._listeners.splice(A, 1);
            break;
        }
    }
};
Timeline.DefaultEventSource.prototype.loadXML = function(G, A)
{
    var C = this._getBaseURL(A);
    var H = G.documentElement.getAttribute("wiki-url");
    var J = G.documentElement.getAttribute("wiki-section");
    var F = G.documentElement.getAttribute("date-time-format");
    var E = this._events.getUnit().getParser(F);
    var D = G.documentElement.firstChild;
    var I = false;
    while (D != null)
    {
        if (D.nodeType == 1)
        {
            var L = "";
            if (D.firstChild != null && D.firstChild.nodeType == 3)
            {
                L = D.firstChild.nodeValue;
            }
            var B = (D.getAttribute("isDuration") === null && D.getAttribute("durationEvent") === null) || D.getAttribute("isDuration") == "false" || D.getAttribute("durationEvent") == "false";
            var K = new Timeline.DefaultEventSource.Event({id:D.getAttribute("id"),start:E(D.getAttribute("start")),end:E(D.getAttribute("end")),latestStart:E(D.getAttribute("latestStart")),earliestEnd:E(D.getAttribute("earliestEnd")),instant:B,text:D.getAttribute("title"),description:L,image:this._resolveRelativeURL(D.getAttribute("image"), C),link:this._resolveRelativeURL(D.getAttribute("link"), C),icon:this._resolveRelativeURL(D.getAttribute("icon"), C),color:D.getAttribute("color"),textColor:D.getAttribute("textColor"),hoverText:D.getAttribute("hoverText"),classname:D.getAttribute("classname"),tapeImage:D.getAttribute("tapeImage"),tapeRepeat:D.getAttribute("tapeRepeat"),caption:D.getAttribute("caption"),eventID:D.getAttribute("eventID"),trackNum:D.getAttribute("trackNum")});
            K._node = D;
            K.getProperty = function(M)
            {
                return this._node.getAttribute(M);
            };
            K.setWikiInfo(H, J);
            this._events.add(K);
            I = true;
        }
        D = D.nextSibling;
    }
    if (I)
    {
        this._fire("onAddMany", []);
    }
};
Timeline.DefaultEventSource.prototype.loadJSON = function(H, B)
{
    var D = this._getBaseURL(B);
    var J = false;
    if (H && H.events)
    {
        var I = ("wikiURL" in H) ? H.wikiURL : null;
        var K = ("wikiSection" in H) ? H.wikiSection : null;
        var F = ("dateTimeFormat" in H) ? H.dateTimeFormat : null;
        var E = this._events.getUnit().getParser(F);
        for (var G = 0;
             G < H.events.length;
             G++)
        {
            var A = H.events[G];
            var C = A.isDuration || (A.durationEvent != null && !A.durationEvent);
            var L = new Timeline.DefaultEventSource.Event({id:("id" in A) ? A.id : undefined,start:E(A.start),end:E(A.end),latestStart:E(A.latestStart),earliestEnd:E(A.earliestEnd),instant:C,text:A.title,description:A.description,image:this._resolveRelativeURL(A.image, D),link:this._resolveRelativeURL(A.link, D),icon:this._resolveRelativeURL(A.icon, D),color:A.color,textColor:A.textColor,hoverText:A.hoverText,classname:A.classname,tapeImage:A.tapeImage,tapeRepeat:A.tapeRepeat,caption:A.caption,eventID:A.eventID,trackNum:A.trackNum});
            L._obj = A;
            L.getProperty = function(M)
            {
                return this._obj[M];
            };
            L.setWikiInfo(I, K);
            this._events.add(L);
            J = true;
        }
    }
    if (J)
    {
        this._fire("onAddMany", []);
    }
};
Timeline.DefaultEventSource.prototype.loadSPARQL = function(I, B)
{
    var E = this._getBaseURL(B);
    var H = "iso8601";
    var G = this._events.getUnit().getParser(H);
    if (I == null)
    {
        return;
    }
    var F = I.documentElement.firstChild;
    while (F != null && (F.nodeType != 1 || F.nodeName != "results"))
    {
        F = F.nextSibling;
    }
    var J = null;
    var L = null;
    if (F != null)
    {
        J = F.getAttribute("wiki-url");
        L = F.getAttribute("wiki-section");
        F = F.firstChild;
    }
    var K = false;
    while (F != null)
    {
        if (F.nodeType == 1)
        {
            var D = {};
            var A = F.firstChild;
            while (A != null)
            {
                if (A.nodeType == 1 && A.firstChild != null && A.firstChild.nodeType == 1 && A.firstChild.firstChild != null && A.firstChild.firstChild.nodeType == 3)
                {
                    D[A.getAttribute("name")] = A.firstChild.firstChild.nodeValue;
                }
                A = A.nextSibling;
            }
            if (D["start"] == null && D["date"] != null)
            {
                D["start"] = D["date"];
            }
            var C = (D["isDuration"] === null && D["durationEvent"] === null) || D["isDuration"] == "false" || D["durationEvent"] == "false";
            var M = new Timeline.DefaultEventSource.Event({id:D["id"],start:G(D["start"]),end:G(D["end"]),latestStart:G(D["latestStart"]),earliestEnd:G(D["earliestEnd"]),instant:C,text:D["title"],description:D["description"],image:this._resolveRelativeURL(D["image"], E),link:this._resolveRelativeURL(D["link"], E),icon:this._resolveRelativeURL(D["icon"], E),color:D["color"],textColor:D["textColor"],hoverText:D["hoverText"],caption:D["caption"],classname:D["classname"],tapeImage:D["tapeImage"],tapeRepeat:D["tapeRepeat"],eventID:D["eventID"],trackNum:D["trackNum"]});
            M._bindings = D;
            M.getProperty = function(N)
            {
                return this._bindings[N];
            };
            M.setWikiInfo(J, L);
            this._events.add(M);
            K = true;
        }
        F = F.nextSibling;
    }
    if (K)
    {
        this._fire("onAddMany", []);
    }
};
Timeline.DefaultEventSource.prototype.add = function(A)
{
    this._events.add(A);
    this._fire("onAddOne", [A]);
};
Timeline.DefaultEventSource.prototype.addMany = function(A)
{
    for (var B = 0;
         B < A.length;
         B++)
    {
        this._events.add(A[B]);
    }
    this._fire("onAddMany", []);
};
Timeline.DefaultEventSource.prototype.clear = function()
{
    this._events.removeAll();
    this._fire("onClear", []);
};
Timeline.DefaultEventSource.prototype.getEvent = function(A)
{
    return this._events.getEvent(A);
};
Timeline.DefaultEventSource.prototype.getEventIterator = function(A, B)
{
    return this._events.getIterator(A, B);
};
Timeline.DefaultEventSource.prototype.getEventReverseIterator = function(A, B)
{
    return this._events.getReverseIterator(A, B);
};
Timeline.DefaultEventSource.prototype.getAllEventIterator = function()
{
    return this._events.getAllIterator();
};
Timeline.DefaultEventSource.prototype.getCount = function()
{
    return this._events.getCount();
};
Timeline.DefaultEventSource.prototype.getEarliestDate = function()
{
    return this._events.getEarliestDate();
};
Timeline.DefaultEventSource.prototype.getLatestDate = function()
{
    return this._events.getLatestDate();
};
Timeline.DefaultEventSource.prototype._fire = function(B, A)
{
    for (var C = 0;
         C < this._listeners.length;
         C++)
    {
        var D = this._listeners[C];
        if (B in D)
        {
            try
            {
                D[B].apply(D, A);
            } catch(E)
            {
                SimileAjax.Debug.exception(E);
            }
        }
    }
};
Timeline.DefaultEventSource.prototype._getBaseURL = function(A)
{
    if (A.indexOf("://") < 0)
    {
        var C = this._getBaseURL(document.location.href);
        if (A.substr(0, 1) == "/")
        {
            A = C.substr(0, C.indexOf("/", C.indexOf("://") + 3)) + A;
        }
        else
        {
            A = C + A;
        }
    }
    var B = A.lastIndexOf("/");
    if (B < 0)
    {
        return"";
    }
    else
    {
        return A.substr(0, B + 1);
    }
};
Timeline.DefaultEventSource.prototype._resolveRelativeURL = function(A, B)
{
    if (A == null || A == "")
    {
        return A;
    }
    else
    {
        if (A.indexOf("://") > 0)
        {
            return A;
        }
        else
        {
            if (A.substr(0, 1) == "/")
            {
                return B.substr(0, B.indexOf("/", B.indexOf("://") + 3)) + A;
            }
            else
            {
                return B + A;
            }
        }
    }
};
Timeline.DefaultEventSource.Event = function(A)
{
    function D(E)
    {
        return(A[E] != null && A[E] != "") ? A[E] : null;
    }

    var C = A.id ? A.id.trim() : "";
    this._id = C.length > 0 ? C : Timeline.EventUtils.getNewEventID();
    this._instant = A.instant || (A.end == null);
    this._start = A.start;
    this._end = (A.end != null) ? A.end : A.start;
    this._latestStart = (A.latestStart != null) ? A.latestStart : (A.instant ? this._end : this._start);
    this._earliestEnd = (A.earliestEnd != null) ? A.earliestEnd : this._end;
    var B = [];
    if (this._start > this._latestStart)
    {
        this._latestStart = this._start;
        B.push("start is > latestStart");
    }
    if (this._start > this._earliestEnd)
    {
        this._earliestEnd = this._latestStart;
        B.push("start is > earliestEnd");
    }
    if (this._start > this._end)
    {
        this._end = this._earliestEnd;
        B.push("start is > end");
    }
    if (this._latestStart > this._earliestEnd)
    {
        this._earliestEnd = this._latestStart;
        B.push("latestStart is > earliestEnd");
    }
    if (this._latestStart > this._end)
    {
        this._end = this._earliestEnd;
        B.push("latestStart is > end");
    }
    if (this._earliestEnd > this._end)
    {
        this._end = this._earliestEnd;
        B.push("earliestEnd is > end");
    }
    this._eventID = D("eventID");
    this._text = (A.text != null) ? SimileAjax.HTML.deEntify(A.text) : "";
    if (B.length > 0)
    {
        this._text += " PROBLEM: " + B.join(", ");
    }
    this._description = SimileAjax.HTML.deEntify(A.description);
    this._image = D("image");
    this._link = D("link");
    this._title = D("hoverText");
    this._title = D("caption");
    this._icon = D("icon");
    this._color = D("color");
    this._textColor = D("textColor");
    this._classname = D("classname");
    this._tapeImage = D("tapeImage");
    this._tapeRepeat = D("tapeRepeat");
    this._trackNum = D("trackNum");
    if (this._trackNum != null)
    {
        this._trackNum = parseInt(this._trackNum);
    }
    this._wikiURL = null;
    this._wikiSection = null;
};
Timeline.DefaultEventSource.Event.prototype = {getID:function()
{
    return this._id;
},isInstant:function()
{
    return this._instant;
},isImprecise:function()
{
    return this._start != this._latestStart || this._end != this._earliestEnd;
},getStart:function()
{
    return this._start;
},getEnd:function()
{
    return this._end;
},getLatestStart:function()
{
    return this._latestStart;
},getEarliestEnd:function()
{
    return this._earliestEnd;
},getEventID:function()
{
    return this._eventID;
},getText:function()
{
    return this._text;
},getDescription:function()
{
    return this._description;
},getImage:function()
{
    return this._image;
},getLink:function()
{
    return this._link;
},getIcon:function()
{
    return this._icon;
},getColor:function()
{
    return this._color;
},getTextColor:function()
{
    return this._textColor;
},getClassName:function()
{
    return this._classname;
},getTapeImage:function()
{
    return this._tapeImage;
},getTapeRepeat:function()
{
    return this._tapeRepeat;
},getTrackNum:function()
{
    return this._trackNum;
},getProperty:function(A)
{
    return null;
},getWikiURL:function()
{
    return this._wikiURL;
},getWikiSection:function()
{
    return this._wikiSection;
},setWikiInfo:function(B, A)
{
    this._wikiURL = B;
    this._wikiSection = A;
},fillDescription:function(A)
{
    A.innerHTML = this._description;
},fillWikiInfo:function(D)
{
    D.style.display = "none";
    if (this._wikiURL == null || this._wikiSection == null)
    {
        return;
    }
    var C = this.getProperty("wikiID");
    if (C == null || C.length == 0)
    {
        C = this.getText();
    }
    if (C == null || C.length == 0)
    {
        return;
    }
    D.style.display = "inline";
    C = C.replace(/\s/g, "_");
    var B = this._wikiURL + this._wikiSection.replace(/\s/g, "_") + "/" + C;
    var A = document.createElement("a");
    A.href = B;
    A.target = "new";
    A.innerHTML = Timeline.strings[Timeline.clientLocale].wikiLinkLabel;
    D.appendChild(document.createTextNode("["));
    D.appendChild(A);
    D.appendChild(document.createTextNode("]"));
},fillTime:function(A, B)
{
    if (this._instant)
    {
        if (this.isImprecise())
        {
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
            A.appendChild(A.ownerDocument.createElement("br"));
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._end)));
        }
        else
        {
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
        }
    }
    else
    {
        if (this.isImprecise())
        {
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start) + " ~ " + B.labelPrecise(this._latestStart)));
            A.appendChild(A.ownerDocument.createElement("br"));
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._earliestEnd) + " ~ " + B.labelPrecise(this._end)));
        }
        else
        {
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._start)));
            A.appendChild(A.ownerDocument.createElement("br"));
            A.appendChild(A.ownerDocument.createTextNode(B.labelPrecise(this._end)));
        }
    }
},fillInfoBubble:function(A, E, M)
{
    var K = A.ownerDocument;
    var J = this.getText();
    var H = this.getLink();
    var B = this.getImage();
    if (B != null)
    {
        var D = K.createElement("img");
        D.src = B;
        E.event.bubble.imageStyler(D);
        A.appendChild(D);
    }
    var L = K.createElement("div");
    var C = K.createTextNode(J);
    if (H != null)
    {
        var I = K.createElement("a");
        I.href = H;
        I.appendChild(C);
        L.appendChild(I);
    }
    else
    {
        L.appendChild(C);
    }
    E.event.bubble.titleStyler(L);
    A.appendChild(L);
    var N = K.createElement("div");
    this.fillDescription(N);
    E.event.bubble.bodyStyler(N);
    A.appendChild(N);
    var G = K.createElement("div");
    this.fillTime(G, M);
    E.event.bubble.timeStyler(G);
    A.appendChild(G);
    var F = K.createElement("div");
    this.fillWikiInfo(F);
    E.event.bubble.wikiStyler(F);
    A.appendChild(F);
}};


/* themes.js */
Timeline.ClassicTheme = new Object();
Timeline.ClassicTheme.implementations = [];
Timeline.ClassicTheme.create = function(B)
{
    if (B == null)
    {
        B = Timeline.getDefaultLocale();
    }
    var A = Timeline.ClassicTheme.implementations[B];
    if (A == null)
    {
        A = Timeline.ClassicTheme._Impl;
    }
    return new A();
};
Timeline.ClassicTheme._Impl = function()
{
    this.firstDayOfWeek = 0;
    this.autoWidth = false;
    this.autoWidthAnimationTime = 500;
    this.timeline_start = null;
    this.timeline_stop = null;
    this.ether = {backgroundColors:[],highlightOpacity:50,interval:{line:{show:true,opacity:25},weekend:{opacity:30},marker:{hAlign:"Bottom",vAlign:"Right"}}};
    this.event = {track:{height:10,gap:2,offset:2,autoWidthMargin:1.5},overviewTrack:{offset:20,tickHeight:6,height:2,gap:1,autoWidthMargin:5},tape:{height:4},instant:{icon:Timeline.urlPrefix + "images/dull-blue-circle.png",iconWidth:10,iconHeight:10,impreciseOpacity:20,impreciseIconMargin:3},duration:{impreciseOpacity:20},label:{backgroundOpacity:50,offsetFromLine:3},highlightColors:["#FFFF00","#FFC000","#FF0000","#0000FF"],highlightLabelBackground:false,bubble:{width:250,maxHeight:0,titleStyler:function(A)
    {
        A.className = "timeline-event-bubble-title";
    },bodyStyler:function(A)
    {
        A.className = "timeline-event-bubble-body";
    },imageStyler:function(A)
    {
        A.className = "timeline-event-bubble-image";
    },wikiStyler:function(A)
    {
        A.className = "timeline-event-bubble-wiki";
    },timeStyler:function(A)
    {
        A.className = "timeline-event-bubble-time";
    }}};
    this.mouseWheel = "scroll";
};


/* timeline.js */
Timeline.version = "2.3.0";
Timeline.ajax_lib_version = SimileAjax.version;
Timeline.display_version = Timeline.version + " (with Ajax lib " + Timeline.ajax_lib_version + ")";
Timeline.strings = {};
Timeline.HORIZONTAL = 0;
Timeline.VERTICAL = 1;
Timeline._defaultTheme = null;
Timeline.getDefaultLocale = function()
{
    return Timeline.clientLocale;
};
Timeline.create = function(D, C, E, F)
{
    if (Timeline.timelines == null)
    {
        Timeline.timelines = [];
    }
    var B = Timeline.timelines.length;
    Timeline.timelines[B] = null;
    var A = new Timeline._Impl(D, C, E, F, B);
    Timeline.timelines[B] = A;
    return A;
};
Timeline.createBandInfo = function(F)
{
    var G = ("theme" in F) ? F.theme : Timeline.getDefaultTheme();
    var D = ("eventSource" in F) ? F.eventSource : null;
    var H = new Timeline.LinearEther({centersOn:("date" in F) ? F.date : new Date(),interval:SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],pixelsPerInterval:F.intervalPixels,theme:G});
    var C = new Timeline.GregorianEtherPainter({unit:F.intervalUnit,multiple:("multiple" in F) ? F.multiple : 1,theme:G,align:("align" in F) ? F.align : undefined});
    var I = {showText:("showEventText" in F) ? F.showEventText : true,theme:G};
    if ("eventPainterParams" in F)
    {
        for (var A in F.eventPainterParams)
        {
            I[A] = F.eventPainterParams[A];
        }
    }
    if ("trackHeight" in F)
    {
        I.trackHeight = F.trackHeight;
    }
    if ("trackGap" in F)
    {
        I.trackGap = F.trackGap;
    }
    var B = ("overview" in F && F.overview) ? "overview" : ("layout" in F ? F.layout : "original");
    var E;
    if ("eventPainter" in F)
    {
        E = new F.eventPainter(I);
    }
    else
    {
        switch (B)
        {case"overview":E = new Timeline.OverviewEventPainter(I);
            break;
            case"detailed":E = new Timeline.DetailedEventPainter(I);
                break;
            default:E = new Timeline.OriginalEventPainter(I);
        }
    }
    return{width:F.width,eventSource:D,timeZone:("timeZone" in F) ? F.timeZone : 0,ether:H,etherPainter:C,eventPainter:E,theme:G,zoomIndex:("zoomIndex" in F) ? F.zoomIndex : 0,zoomSteps:("zoomSteps" in F) ? F.zoomSteps : null};
};
Timeline.createHotZoneBandInfo = function(F)
{
    var G = ("theme" in F) ? F.theme : Timeline.getDefaultTheme();
    var D = ("eventSource" in F) ? F.eventSource : null;
    var H = new Timeline.HotZoneEther({centersOn:("date" in F) ? F.date : new Date(),interval:SimileAjax.DateTime.gregorianUnitLengths[F.intervalUnit],pixelsPerInterval:F.intervalPixels,zones:F.zones,theme:G});
    var C = new Timeline.HotZoneGregorianEtherPainter({unit:F.intervalUnit,zones:F.zones,theme:G,align:("align" in F) ? F.align : undefined});
    var I = {showText:("showEventText" in F) ? F.showEventText : true,theme:G};
    if ("eventPainterParams" in F)
    {
        for (var A in F.eventPainterParams)
        {
            I[A] = F.eventPainterParams[A];
        }
    }
    if ("trackHeight" in F)
    {
        I.trackHeight = F.trackHeight;
    }
    if ("trackGap" in F)
    {
        I.trackGap = F.trackGap;
    }
    var B = ("overview" in F && F.overview) ? "overview" : ("layout" in F ? F.layout : "original");
    var E;
    if ("eventPainter" in F)
    {
        E = new F.eventPainter(I);
    }
    else
    {
        switch (B)
        {case"overview":E = new Timeline.OverviewEventPainter(I);
            break;
            case"detailed":E = new Timeline.DetailedEventPainter(I);
                break;
            default:E = new Timeline.OriginalEventPainter(I);
        }
    }
    return{width:F.width,eventSource:D,timeZone:("timeZone" in F) ? F.timeZone : 0,ether:H,etherPainter:C,eventPainter:E,theme:G,zoomIndex:("zoomIndex" in F) ? F.zoomIndex : 0,zoomSteps:("zoomSteps" in F) ? F.zoomSteps : null};
};
Timeline.getDefaultTheme = function()
{
    if (Timeline._defaultTheme == null)
    {
        Timeline._defaultTheme = Timeline.ClassicTheme.create(Timeline.getDefaultLocale());
    }
    return Timeline._defaultTheme;
};
Timeline.setDefaultTheme = function(A)
{
    Timeline._defaultTheme = A;
};
Timeline.loadXML = function(A, C)
{
    var D = function(G, F, E)
    {
        alert("Failed to load data xml from " + A + "\n" + G);
    };
    var B = function(F)
    {
        var E = F.responseXML;
        if (!E.documentElement && F.responseStream)
        {
            E.load(F.responseStream);
        }
        C(E, A);
    };
    SimileAjax.XmlHttp.get(A, D, B);
};
Timeline.loadJSON = function(url, f)
{
    var fError = function(statusText, status, xmlhttp)
    {
        alert("Failed to load json data from " + url + "\n" + statusText);
    };
    var fDone = function(xmlhttp)
    {
        f(eval("(" + xmlhttp.responseText + ")"), url);
    };
    SimileAjax.XmlHttp.get(url, fError, fDone);
};
Timeline.getTimelineFromID = function(A)
{
    return Timeline.timelines[A];
};
Timeline.writeVersion = function(A)
{
    document.getElementById(A).innerHTML = this.display_version;
};
Timeline._Impl = function(C, B, D, E, A)
{
    SimileAjax.WindowManager.initialize();
    this._containerDiv = C;
    this._bandInfos = B;
    this._orientation = D == null ? Timeline.HORIZONTAL : D;
    this._unit = (E != null) ? E : SimileAjax.NativeDateUnit;
    this._starting = true;
    this._autoResizing = false;
    this.autoWidth = B && B[0] && B[0].theme && B[0].theme.autoWidth;
    this.autoWidthAnimationTime = B && B[0] && B[0].theme && B[0].theme.autoWidthAnimationTime;
    this.timelineID = A;
    this.timeline_start = B && B[0] && B[0].theme && B[0].theme.timeline_start;
    this.timeline_stop = B && B[0] && B[0].theme && B[0].theme.timeline_stop;
    this.timeline_at_start = false;
    this.timeline_at_stop = false;
    this._initialize();
};
Timeline._Impl.prototype.dispose = function()
{
    for (var A = 0;
         A < this._bands.length;
         A++)
    {
        this._bands[A].dispose();
    }
    this._bands = null;
    this._bandInfos = null;
    this._containerDiv.innerHTML = "";
    Timeline.timelines[this.timelineID] = null;
};
Timeline._Impl.prototype.getBandCount = function()
{
    return this._bands.length;
};
Timeline._Impl.prototype.getBand = function(A)
{
    return this._bands[A];
};
Timeline._Impl.prototype.finishedEventLoading = function()
{
    this._autoWidthCheck(true);
    this._starting = false;
};
Timeline._Impl.prototype.layout = function()
{
    this._autoWidthCheck(true);
    this._distributeWidths();
};
Timeline._Impl.prototype.paint = function()
{
    for (var A = 0;
         A < this._bands.length;
         A++)
    {
        this._bands[A].paint();
    }
};
Timeline._Impl.prototype.getDocument = function()
{
    return this._containerDiv.ownerDocument;
};
Timeline._Impl.prototype.addDiv = function(A)
{
    this._containerDiv.appendChild(A);
};
Timeline._Impl.prototype.removeDiv = function(A)
{
    this._containerDiv.removeChild(A);
};
Timeline._Impl.prototype.isHorizontal = function()
{
    return this._orientation == Timeline.HORIZONTAL;
};
Timeline._Impl.prototype.isVertical = function()
{
    return this._orientation == Timeline.VERTICAL;
};
Timeline._Impl.prototype.getPixelLength = function()
{
    return this._orientation == Timeline.HORIZONTAL ? this._containerDiv.offsetWidth : this._containerDiv.offsetHeight;
};
Timeline._Impl.prototype.getPixelWidth = function()
{
    return this._orientation == Timeline.VERTICAL ? this._containerDiv.offsetWidth : this._containerDiv.offsetHeight;
};
Timeline._Impl.prototype.getUnit = function()
{
    return this._unit;
};
Timeline._Impl.prototype.getWidthStyle = function()
{
    return this._orientation == Timeline.HORIZONTAL ? "height" : "width";
};
Timeline._Impl.prototype.loadXML = function(B, D)
{
    var A = this;
    var E = function(H, G, F)
    {
        alert("Failed to load data xml from " + B + "\n" + H);
        A.hideLoadingMessage();
    };
    var C = function(G)
    {
        try
        {
            var F = G.responseXML;
            if (!F.documentElement && G.responseStream)
            {
                F.load(G.responseStream);
            }
            D(F, B);
        } finally
        {
            A.hideLoadingMessage();
        }
    };
    this.showLoadingMessage();
    window.setTimeout(function()
    {
        SimileAjax.XmlHttp.get(B, E, C);
    }, 0);
};
Timeline._Impl.prototype.loadJSON = function(url, f)
{
    var tl = this;
    var fError = function(statusText, status, xmlhttp)
    {
        alert("Failed to load json data from " + url + "\n" + statusText);
        tl.hideLoadingMessage();
    };
    var fDone = function(xmlhttp)
    {
        try
        {
            f(eval("(" + xmlhttp.responseText + ")"), url);
        } finally
        {
            tl.hideLoadingMessage();
        }
    };
    this.showLoadingMessage();
    window.setTimeout(function()
    {
        SimileAjax.XmlHttp.get(url, fError, fDone);
    }, 0);
};
Timeline._Impl.prototype._autoWidthScrollListener = function(A)
{
    A.getTimeline()._autoWidthCheck(false);
};
Timeline._Impl.prototype._autoWidthCheck = function(C)
{
    var A = this;
    var B = A._starting;
    var D = 0;

    function E()
    {
        var G = A.getWidthStyle();
        if (B)
        {
            A._containerDiv.style[G] = D + "px";
        }
        else
        {
            A._autoResizing = true;
            var H = {};
            H[G] = D + "px";
            SimileAjax.jQuery(A._containerDiv).animate(H, A.autoWidthAnimationTime, "linear", function()
            {
                A._autoResizing = false;
            });
        }
    }

    function F()
    {
        var H = 0;
        var G = A.getPixelWidth();
        if (A._autoResizing)
        {
            return;
        }
        for (var I = 0;
             I < A._bands.length;
             I++)
        {
            A._bands[I].checkAutoWidth();
            H += A._bandInfos[I].width;
        }
        if (H > G || C)
        {
            D = H;
            E();
            A._distributeWidths();
        }
    }

    if (!A.autoWidth)
    {
        return;
    }
    F();
};
Timeline._Impl.prototype._initialize = function()
{
    var H = this._containerDiv;
    var E = H.ownerDocument;
    H.className = H.className.split(" ").concat("timeline-container").join(" ");
    var C = (this.isHorizontal()) ? "horizontal" : "vertical";
    H.className += " timeline-" + C;
    while (H.firstChild)
    {
        H.removeChild(H.firstChild);
    }
    var A = SimileAjax.Graphics.createTranslucentImage(Timeline.urlPrefix + (this.isHorizontal() ? "images/copyright-vertical.png" : "images/copyright.png"));
    A.className = "timeline-copyright";
    A.title = "Timeline copyright SIMILE - www.code.google.com/p/simile-widgets/";
    SimileAjax.DOM.registerEvent(A, "click", function()
    {
        window.location = "http://code.google.com/p/simile-widgets/";
    });
    H.appendChild(A);
    this._bands = [];
    for (var B = 0;
         B < this._bandInfos.length;
         B++)
    {
        var G = new Timeline._Band(this, this._bandInfos[B], B);
        this._bands.push(G);
    }
    this._distributeWidths();
    for (var B = 0;
         B < this._bandInfos.length;
         B++)
    {
        var F = this._bandInfos[B];
        if ("syncWith" in F)
        {
            this._bands[B].setSyncWithBand(this._bands[F.syncWith], ("highlight" in F) ? F.highlight : false);
        }
    }
    if (this.autoWidth)
    {
        for (var B = 0;
             B < this._bands.length;
             B++)
        {
            this._bands[B].addOnScrollListener(this._autoWidthScrollListener);
        }
    }
    var D = SimileAjax.Graphics.createMessageBubble(E);
    D.containerDiv.className = "timeline-message-container";
    H.appendChild(D.containerDiv);
    D.contentDiv.className = "timeline-message";
    D.contentDiv.innerHTML = "<img src='" + Timeline.urlPrefix + "images/progress-running.gif' /> Loading...";
    this.showLoadingMessage = function()
    {
        D.containerDiv.style.display = "block";
    };
    this.hideLoadingMessage = function()
    {
        D.containerDiv.style.display = "none";
    };
};
Timeline._Impl.prototype._distributeWidths = function()
{
    var G = this.getPixelLength();
    var B = this.getPixelWidth();
    var C = 0;
    for (var F = 0;
         F < this._bands.length;
         F++)
    {
        var J = this._bands[F];
        var I = this._bandInfos[F];
        var E = I.width;
        var D;
        if (typeof E == "string")
        {
            var H = E.indexOf("%");
            if (H > 0)
            {
                var A = parseInt(E.substr(0, H));
                D = Math.round(A * B / 100);
            }
            else
            {
                D = parseInt(E);
            }
        }
        else
        {
            D = E;
        }
        J.setBandShiftAndWidth(C, D);
        J.setViewLength(G);
        C += D;
    }
};
Timeline._Impl.prototype.shiftOK = function(C, B)
{
    var F = B > 0,A = B < 0;
    if ((F && this.timeline_start == null) || (A && this.timeline_stop == null) || (B == 0))
    {
        return(true);
    }
    var H = false;
    for (var E = 0;
         E < this._bands.length && !H;
         E++)
    {
        H = this._bands[E].busy();
    }
    if (H)
    {
        return(true);
    }
    if ((F && this.timeline_at_start) || (A && this.timeline_at_stop))
    {
        return(false);
    }
    var D = false;
    for (var E = 0;
         E < this._bands.length && !D;
         E++)
    {
        var G = this._bands[E];
        if (F)
        {
            D = (E == C ? G.getMinVisibleDateAfterDelta(B) : G.getMinVisibleDate()) >= this.timeline_start;
        }
        else
        {
            D = (E == C ? G.getMaxVisibleDateAfterDelta(B) : G.getMaxVisibleDate()) <= this.timeline_stop;
        }
    }
    if (F)
    {
        this.timeline_at_start = !D;
        this.timeline_at_stop = false;
    }
    else
    {
        this.timeline_at_stop = !D;
        this.timeline_at_start = false;
    }
    return(D);
};
Timeline._Impl.prototype.zoom = function(D, A, G, F)
{
    var C = new RegExp("^timeline-band-([0-9]+)$");
    var E = null;
    var B = C.exec(F.id);
    if (B)
    {
        E = parseInt(B[1]);
    }
    if (E != null)
    {
        this._bands[E].zoom(D, A, G, F);
    }
    this.paint();
};


/* units.js */
Timeline.NativeDateUnit = new Object();
Timeline.NativeDateUnit.createLabeller = function(B, A)
{
    return new Timeline.GregorianDateLabeller(B, A);
};
Timeline.NativeDateUnit.makeDefaultValue = function()
{
    return new Date();
};
Timeline.NativeDateUnit.cloneValue = function(A)
{
    return new Date(A.getTime());
};
Timeline.NativeDateUnit.getParser = function(A)
{
    if (typeof A == "string")
    {
        A = A.toLowerCase();
    }
    return(A == "iso8601" || A == "iso 8601") ? Timeline.DateTime.parseIso8601DateTime : Timeline.DateTime.parseGregorianDateTime;
};
Timeline.NativeDateUnit.parseFromObject = function(A)
{
    return Timeline.DateTime.parseGregorianDateTime(A);
};
Timeline.NativeDateUnit.toNumber = function(A)
{
    return A.getTime();
};
Timeline.NativeDateUnit.fromNumber = function(A)
{
    return new Date(A);
};
Timeline.NativeDateUnit.compare = function(D, C)
{
    var B,A;
    if (typeof D == "object")
    {
        B = D.getTime();
    }
    else
    {
        B = Number(D);
    }
    if (typeof C == "object")
    {
        A = C.getTime();
    }
    else
    {
        A = Number(C);
    }
    return B - A;
};
Timeline.NativeDateUnit.earlier = function(B, A)
{
    return Timeline.NativeDateUnit.compare(B, A) < 0 ? B : A;
};
Timeline.NativeDateUnit.later = function(B, A)
{
    return Timeline.NativeDateUnit.compare(B, A) > 0 ? B : A;
};
Timeline.NativeDateUnit.change = function(A, B)
{
    return new Date(A.getTime() + B);
};
